2010-03-25 56 views
5

我跑在調試模式下在Visual Studio此C#代碼:爲什麼Visual Studio在靜態構造函數中發生異常時不顯示異常消息?

public class MyHandlerFactory : IHttpHandlerFactory 
{ 
    private static Dictionary<string, bool> myDictionary = new Dictionary<string, bool>(); 
    static MyHandlerFactory() 
    { 
    myDictionary.Add("someKey",true); 
    myDictionary.Add("someKey",true); // fails due to duplicate key 
    } 
} 

靜態構造函數之外,當我與錯誤的Visual Studio行凸顯,並彈出一個消息,關於異常。但在靜態構造函數中,我沒有收到這樣的消息。我正在逐行進行,所以我知道我正在接近這條線,而不是進一步。

這是爲什麼?

(我不知道,如果是事實,我的類實現IHttpHandlerFactory問題,但我把它以防萬一。)

這是VS2005,NET 2.0

編輯:我只是想補充一下,事實上它是一個HttpHandler 確實似乎很重要。正如答案所指出的那樣,默認行爲是打破TypeInitializationException而不是內部異常。我測試了另一個沒有HttpHandler的例子,並且看到這導致程序在使用該類的第一行中斷開。但在這種情況下,我的代碼中沒有任何內容可以打破,因爲該類僅在我的web.config文件中被指定爲HttpHandler。因此,它完全沒有打破例外。

回答

9

問題是拋出的異常實際上是一個包裝拋出異常的TypeInitializationException異常。我不確定什麼設計折衷導致了這一點,但IMO是.NET開發中最令人討厭的事情之一,我很難過看到它仍然在.NET 4中。

在VS中,爲了趕上異常儘快,您需要打開第一次機會例外。轉到調試>異常並檢查「公共語言運行時異常」,一旦拋出異常就會中斷。 (注意:如果您使用的是動態語言運行時,您需要更加挑剔哪些異常被捕獲,因爲這顯然使用流量控制的異常)。

+0

感謝您的回答。然而,我在Debug> Exceptions ...中看到的選擇是「C++ Exceptions」,「Common Language Runtime Exceptions」,「Managed Debugging Assistants」,「Native Run-Time Checks」和「Win32 Exceptions」。其中一個是「.Net Exceptions」嗎?我找不到它。 – 2010-03-26 00:44:02

+0

@Tim Goodman - OOPS!我的意思是「公共語言運行時例外」。我會更新我的答案。 – 2010-03-26 02:55:03

+0

啊,是的,當公共語言運行時異常被拋出導致它打破內部異常時,它會中斷。謝謝。 – 2010-03-26 03:55:03

1

我試過你的代碼,並得到TypeInitializationException,如你所料。沒有問題在我的VS ...

但是,如果你運行這個(或任何其他)應用程序'沒有調試',你應該總是會得到一個錯誤信息的任何未處理的例外 - 沒有VS設置將在這裏有所作爲。

+0

你在哪一行得到TypeInitializationException?我現在想的問題是,它通常會在第一行引用錯誤(引起靜態構造函數被調用的類)的錯誤,但在這種情況下,它被稱爲HttpHandler,因此沒有行去。 – 2010-03-26 03:47:56

+0

TypeInitializationException出現在創建類的新實例的行上:MyHandlerFactory factory = new MyHandlerFactory();但是我嘗試了它沒有它來自的接口。也許你可以擴展我們可以很好地測試它的樣本,因爲它是在你的代碼中。 – Machta 2010-03-26 17:53:07

+0

我今天又碰到了這個7歲的問題,所以我想我遲遲沒有回覆你的評論。 :)爲了重現此問題,我認爲有必要在ASP.NET Web應用程序的Web.config中註冊HTTP處理程序(請參閱:https://msdn.microsoft.com/en-us/library/46c5ddfy。 aspx)並通過嘗試加載網頁應用程序的頁面來訪問它。 – 2017-05-18 06:43:35

0

靜態構造函數在應用程序在appdomain中運行之前運行。這可能會導致VS捕獲異常的方式問題,從您的描述來看,這是非常不標準的。這可能是2005年的一個限制。這就是爲什麼你應該總是捕捉到靜態構造函數體內的原因。在新書Effective C#中有一個很好的討論,這裏有#