2009-10-08 83 views
3

這是我以前多次注意到的行爲,我想知道背後的原因。如果您在(Visual Studio 2008)調試器下運行以下程序,則不管您繼續調試的頻率如何,調試器都將繼續打破throw語句。你必須停止調試才能走出去。我期望調試器會中斷一次,然後過程終止,因爲如果您在沒有調試器的情況下運行該程序,就會發生這種情況。有沒有人知道這種行爲的一個很好的理由?爲什麼在調試時未處理的異常不會終止進程?

using System; 

namespace ExceptionTest 
{ 
    static internal class Program 
    { 
     static internal void Main() 
     { 
     try 
     { 
      throw new Exception(); 
     } 
     catch (Exception exception) 
     { 
      Console.WriteLine(exception.Message); 

      // The debuger will never go beyond 
      // the throw statement and terminate 
      // the process. Why? 
      throw; 
     } 
     } 
    } 
} 

回答

2

步進比未處理的異常將終止這個過程 - 它可能只是爲了阻止你意外終止過程,當你不打算。

如果異常是在其他地方處理的(例如在一個通用的外部try-catch塊中),那麼你將能夠跨越異常並且調試器會帶你到它被處理的地方。

0

你不能踩過去一個異常泡沫一路的用了「頂」正在處理 試試這個,如果你真的需要它:

static internal void Main() 
     { 
      try 
      { 
       throw new Exception(); 
      } 
      catch (Exception exception) 
      { 
       Console.WriteLine(exception.Message); 

       // The debuger will never go beyond 
       // the throw statement and terminate 
       // the process. Why? 
       Environment.FailFast("Oops"); 
       throw; 
      } 
     } 
+0

問題是爲什麼我不能這樣做並終止這個過程。 – 2009-10-08 11:02:50

1

如果要殺死進程,請使用「停止」按鈕。有時候停止應用程序確實很有用。調試器沒有堅持要求終止應用程序的原因是程序員可能想要在引發異常的情況下檢查程序的狀態,和/或以這種方式「推動」事件,以使程序可以繼續。值得注意的是調試器陷阱發生在終結器運行之前;這使得可以檢查在最終確定期間將被破壞的程序狀態的各個方面。

還要注意,可能有一個異常會觸發「未捕獲的異常」調試器陷阱,但不會終止程序。例如,我們可以這樣做:

 
Class exTest 
    Class myException 
     Inherits Exception 
     Sub New(ByVal innerException As Exception) 
      MyBase.new("Wrapped Exception", innerException) 
     End Sub 
    End Class 
    Shared Function CopyArg1ToArg2AndReturnFalse(Of T)(ByVal arg1 As T, ByRef arg2 As T) As Boolean 
     arg2 = arg1 
     Return False 
    End Function 
    Shared Sub testIt() 
     Dim theException As Exception = Nothing 
     Try 
      Try 
       Throw New ApplicationException 
      Catch ex As Exception When CopyArg1ToArg2AndReturnFalse(ex, theException) 
       Throw 
      Finally 
       If theException IsNot Nothing Then Throw New myException(theException) 
      End Try 
     Catch ex As myException 
      Debug.Print("Exception: " & ex.InnerException.ToString) 
     End Try 
    End Sub 
End Class 

系統確定任何最後的條款獲得通過,不同的是沒有人願意捕捉ApplicationException的觸發前。然而,如果發生異常,Finally子句將通過拋出一個新的異常來避免該特定異常 - 這是一個新的異常,被捕獲。

這招可以是用於在一些例外將被捕獲並處理在其內的水平的情況下調試是有用的(不中斷用戶體驗),而其他人將在外層被捕獲(例如搭錯誤消息)。只會被困在外層的異常會在它們發生時產生一個調試器陷阱,而那些被困在內層的陷阱將允許程序繼續。

相關問題