Почему необработанное исключение не завершает процесс во время отладки? - PullRequest
3 голосов
/ 08 октября 2009

Это поведение я заметил несколько раз прежде, и я хотел бы знать причину этого. Если вы запускаете следующую программу в отладчике (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;
         }
      }
   }
}

Ответы [ 3 ]

2 голосов
/ 08 октября 2009

Если перешагнуть через необработанное исключение, процесс будет прерван - возможно, он просто остановит вас от случайного завершения процесса, когда вы не намеревались.

Если исключение обрабатывается в другом месте (например, в общем внешнем блоке try-catch), вы сможете перешагнуть через исключение, и отладчик перенесет вас в то место, где оно обрабатывается.

1 голос
/ 29 ноября 2010

Если вы хотите остановить процесс, используйте кнопку «Стоп». Есть моменты, когда полезно остановить приложение. Причина, по которой отладчик не настаивает на уничтожении приложения, заключается в том, что программист может захотеть проверить состояние программы в контексте сгенерированного исключения и / или «подтолкнуть» вещи таким образом, чтобы программа могла продолжаться. Стоит отметить, что ловушка отладчика возникает до запуска финализаторов; это позволяет исследовать аспекты состояния программы, которые могут быть разрушены во время финализации.

Обратите также внимание, что возможно наличие исключения, которое вызовет ловушку отладчика "uncaught exception" и все же не завершит программу. Например, можно сделать что-то вроде:

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

Система определяет, прежде чем какие-либо предложения finally будут вызваны исключением, что никто не собирается перехватывать ApplicationException. Однако, как это случается, если исключение действительно генерируется, предложение Наконец предотвратит выход этого конкретного исключения, создав новое собственное исключение - новое исключение, которое будет поймано.

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

0 голосов
/ 08 октября 2009

Вы не можете перешагнуть через исключение, которое всплывает до самого верха без обработки Попробуйте, если вам это действительно нужно:

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;
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...