2015-10-05 115 views
1

如何在出現未捕獲異常的情況下調試try {...} finally{...}中的finally塊?似乎無論我如何處理異常設置或調試器,Visual Studio都不會讓我繼續執行try塊中拋出的異常點,以便調試finally代碼。如何在Visual Studio中調試finally塊?

這裏的一個代表,短例如:

public static void Main() 
{ 
    var instrument = new Instrument(); 
    try 
    { 
     instrument.TurnOnInstrument(); 
     instrument.DoSomethingThatMightThrowAnException(); 
     throw new Exception(); // Visual Studio won't let me get past here. Only option is to hit "Stop Debugging", which does not proceed through the finally block 
    } 
    finally 
    { 
     if(instrument != null) 
      instrument.TurnOffInstrument(); 
    } 
} 

上下文:我具有控制用於拍攝電子測量在實驗室一些硬件工具,例如一個程序可編程的PSU。如果出現問題,我希望它快速失效:首先關閉儀器以防止可能的物理損壞,然後退出。關閉它們的代碼位於finally塊中,但我無法調試此代碼在錯誤情況下的工作方式。我不想嘗試處理任何可能的錯誤,只需將儀器關閉,然後關閉程序。也許我正在以這種錯誤的方式去做?

+5

有你把'finally'塊中的一行斷點? – hometoast

+2

你能告訴我們一個你的代碼的小例子嗎?如果你想捕獲所有異常而不用擔心它們被捕獲,那麼你將需要爲'Exception'類添加一個catch塊。 –

+0

作爲一個側面說明,我並不認爲使用PC來例如PWM控制一個H橋。 任何異常情況,或只是交換,死鎖等等,你可能會停下來打開MOSFET/IGBT。 當然,這可能會也可能不像您的使用案例。 – Victor

回答

2

一個最後,如果在應用程序崩潰的異常結果,即在案件永遠不會執行塊你碼。 要調試您爲例finally塊,你必須把你的主要功能的整個代碼在其他try語句,並捕獲該異常,以防止應用程序崩潰,就像這樣:

public static void Main() 
{ 
    try 
    { 
     var instrument = new Instrument(); 
     try 
     { 
      instrument.TurnOnInstrument(); 
      instrument.DoSomethingThatMightThrowAnException(); 
      throw new Exception(); 
     } 
     finally 
     { 
      if(instrument != null) 
       instrument.TurnOffInstrument(); 
     } 
    } 
    catch(Exception) 
    { 
     Console.Writeline("An exception occured"); 
    } 
} 
1

您需要在的第一行finally塊的第一行放置一個斷點,然後在異常後再次單擊「運行」。

+1

這不起作用,當引發異常時我得到「Exception was unhandled。一個未處理的異常類型'System.Exception發生在」Blah.exe「」。點擊運行只是重複這一點。 –

+0

當然,如果儀器爲空,斷點在您的示例中絕不會觸發。 我會添加一些靜態無條件代碼來測試斷點。 – Victor

+0

這僅僅是一個例子,如果我把它放在'if塊'本身上,斷點就會打。但是執行永遠不會前進到finally塊,所以這是一個有爭議的問題。 –

2
  1. 您可以設置斷點(F9鍵)和Alt + Ctrl + B鍵來查看斷點列表。
  2. 可以打破使用的IntelliTrace之間,如:

    Set IntelliTrace Settings

+1

感謝您的詳細步驟,但是Visual Studio 2015 Pro SKU不具有Intellitrace,對於這種情況,這不應該是必需的。另外,我知道如何設置/查看斷點。即使是單步執行,代碼執行也不會超過異常拋出,所以如果代碼永遠不會到達那裏,那麼設置斷點並不會有幫助。 –