2009-10-08 47 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子句将通过抛出一个新的异常来避免该特定异常 - 这是一个新的异常,被捕获。

这招可以是用于在一些例外将被捕获并处理在其内的水平的情况下调试是有用的(不中断用户体验),而其他人将在外层被捕获(例如搭错误消息)。只会被困在外层的异常会在它们发生时产生一个调试器陷阱,而那些被困在内层的陷阱将允许程序继续。

相关问题