3

我有一個Windows Forms應用程序和一個Editor類(繼承自Form)。VS2010沒有打破靜態構造函數異常的調試

public partial class Editor : Form 
{ 
    public Editor() 
    { 
     InitializeComponent(); 

     Load += Editor_Load; 
    } 

    private void Editor_Load(object sender, EventArgs e) 
    { 
     cmbConnections.DataSource = ConnectionManager.Connections; 
     cmbConnections.Visible = false; 
    } 

} 

比設計器生成的代碼其他,這是爲形式的唯一代碼(即只包含單個組合框(cmbConnections)。

ConnectionManager類是與一個靜態構造一個靜態類。它的構造函數會進行一些初始化,然後測試一些關鍵條件,如果條件滿足,構造函數會拋出一個異常,但是這個異常在Visual Studio 2010的調試模式下不會中斷。爲了測試這個,我只把throw new Exception()ConnectionManager的靜態構造函數中。使用ConnectionManager併爲此初始化(第一次)在Editor_Load事件處理程序。調用靜態構造函數並引發異常(僅在輸出窗口中可見)。正如預期的那樣,Editor_Load事件處理程序(cmbConnections.Visible = false;)的其餘部分未執行。

但我不明白的是爲什麼我的VS2010吞下異常?它沒有打破調試。它不包含在任何try/catch塊中。它繼續在主窗口中執行程序。它看起來好像在另一個線程上執行Editor_Load

我可以看到在輸出窗口中的消息:

「System.InvalidOperationException」類型的第一次機會異常出現在Editor.exe

型「System.TypeInitializationException」的第一次機會異常發生在Editor.exe中

但是執行在調試模式下根本沒有中斷。

下面是一些我的選擇,我認爲可能會影響此行爲:

項目屬性 - >建設 - >常規 - >優化代碼沒有被選中。

工具 - >選項 - >調試 - >常規 - >啓用只是我的代碼被檢查。

在例外設置中,「用戶未處理」的複選框爲「已檢查」。

我錯過了什麼嗎?這種行爲是否正常?我認爲VS2010會拋出任何未處理的異常。這裏這個沒有處理,仍然沒有破壞。

+2

你忘了提及你有一個64位操作系統。蹩腳的問題,簡單修復:Project + Properties,Build選項卡,將Platform目標從x86更改爲AnyCPU。 – 2012-02-10 00:32:21

+0

我還沒有能夠檢查我的x64系統(我昨天正在開發)。不過,我已經在x86系統上嘗試過相同的解決方案,並且確實打破了VS2010。所以我猜你的評論可能是正確的。我建議你發佈這個答案。導致所有其他答案都包含與問題無關的信息,但僅僅解釋了VS2010異常處理的工作方式。我的問題是關於爲什麼VS2010的行爲超出了它自己的標準 - 我想你已經回答了 - 這是x64系統上的某種錯誤。我會盡快在x64上進行測試,以確認。 – 2012-02-10 09:48:28

+0

[VS2010在64位WinForms應用程序中未顯示未處理的異常消息]的可能重複(http://stackoverflow.com/questions/4933958/vs2010-does-not-show-unhandled-exception-message-in-a -64位winforms應用程序) – 2012-02-10 12:36:00

回答

1

我認爲這是設計,你需要啓用異常對話框中的託管(.NET)異常'投擲'(Ctrl-Alt-E)。

爲了避免很多虛假的(已處理)異常,我通常會盡量接近初始化程序的運行點,然後在繼續之前檢查該複選框。另外,如果有加載程序異常,請確保在異常中檢查嵌套的內部異常或加載程序信息:異常本身通常不是那種提供信息的。我經常不得不挖掘2層或更多層的包裝異常,才能看到實際的錯誤。


我只可以猜測爲什麼是;我的感覺是,靜態類型初始化不被認爲是確定性地運行(許多事情可能會觸發它,而且順序通常是未定義的;只能保證一個類型的靜態構造函數將在使用之前運行,但它可以是幾乎可以在代碼中的任何一點使用,而不需要知道或明確地觸發它)。

因此,這將是很難的運行時間,以確定是否有人(沒有用戶應期待來處理它,因爲它不知道「用戶代碼來處理」 - 確定性 - 初始化會跑)。

但是,這是我的猜想。