2009-10-08 2 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

Вопрос в том, почему я не могу этого сделать и прекратить процесс. –

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 предотвратит исключение этого исключения из исключения, выбросив новое исключение из своего собственного - новое исключение, которое получит.

Этот трюк может быть полезен для отладки в ситуациях, когда некоторые из исключений будут захвачены и обработаны на внутреннем уровне (без нарушения работы пользователя), в то время как другие будут заперты на внешнем уровне (например, вставили сообщение об ошибке). Исключения, которые будут только захвачены на внешнем уровне, будут генерировать ловушку отладчика, когда они произойдут, в то время как те, которые захвачены на внутреннем уровне, позволят программе продолжить работу.

Смежные вопросы