1

У меня есть приложение WinForms, которое использует Application.UnhandledException для отображения диалогового окна, предлагающего пользователю сообщать об ошибке. Когда приложение публикуется и запускается само по себе, оно отлично работает (кроме очевидной проблемы, что вокруг происходит необработанное исключение).Разрешить обработчик события UnhandledException для выполнения при отладке с помощью Visual Studio 2013 Ultimate

Чтобы проверить изменения, я пытался просто выбросить исключение при нажатии кнопки. К сожалению, отладчик мешает. Он будет разбит на исключение (что не является проблемой в других случаях, потому что я хочу знать, что что-то не так), и не позволяйте мне продолжать работу с обработчиком UnhandledException, вместо этого говоря мне, что исключение необрабатывается каждый раз, когда я нажимаю кнопку continue. Я попытался отключить разбивку на любое исключение, конкретные типы исключений и параметр Just My Code на экранах параметров безрезультатно.

Есть ли способ отключить это поведение?

Код протекции ниже, в соответствии с запросом. Это от стандартного, обычного или садового приложения WinForms с одной кнопкой (ThrowButton) в форме запуска. По умолчанию приложение Application Framework включено при создании проекта.

Form1.vb

Public Class Form1 
    Private Sub ThrowButton_Click(sender As Object, e As EventArgs) Handles ThrowButton.Click 
     Throw New Exception 
    End Sub 
End Class 

ApplicationEvents.vb

Namespace My 
    Partial Friend Class MyApplication 

     Private Sub MyApplication_UnhandledException(sender As Object, e As ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException 
      MsgBox("Application event") 
     End Sub 
    End Class 
End Namespace 

Я также поместить копию решения вверх на Диске, в том случае, было бы полезно. Я просмотрел его перед загрузкой, но, очевидно, не могу ручаться за то, что с ним происходит. https://drive.google.com/file/d/0By6VJrYK_X0-QklFWWYtSDBPblU/view?usp=sharing

+0

Visual Studio всегда говорит, что это необработанное исключение, даже при исключительных исключениях. Если вы читаете дальше, в нем также говорится: «Если есть обработчик для этого исключения, программа может быть безопасно продолжена». –

+0

@HansPassant Добавлен пример кода –

+0

@ThomasWeller Я ничего не вижу о безопасном продолжении. Я не могу опубликовать фотографии, но [это] (http://i.imgur.com/Z02eWf2.png) - это сообщение, которое я получаю в Studio. –

ответ

1

Этот ответ был задан для кода C#, прежде чем OP подготовил код VB.NET для загрузки. Пусть он по-прежнему будет полезен для кого-то. Если вы не согласны, отметьте это как не-ответ.

# поведение С следует за MSDN steps for exception dispatching, который говорит на шаге 3:

... но процесс отлаживается, система уведомляет отладчик второй раз.

Учитывая код, как

static void Main(string[] args) 
{ 
    AppDomain.CurrentDomain.UnhandledException += OnUnhandledException; 
    throw new Exception("Help! I am unhandled!"); 
} 

private static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    Console.WriteLine("Caught unhandled exception."); 
    Console.WriteLine(e.IsTerminating ? "Terminating" : "Not terminating"); 
} 

Я бы сказал, что поведение Visual Studio, как ожидается.

  1. необработанную обработчика исключений выполняется (что можно проверить, посмотрев на выходе консоли)
  2. Процесс собирается прекратить, потому что вы не можете установить исключение, как обрабатываются в обработчике
  3. Перед тем, процесс завершается, отладчик скачки

То же самое происходит не только в Visual Studio, но в WinDbg (работает один и тот же исполняемый файл):

0:000> .exr -1 
ExceptionAddress: 750bc42d (KERNELBASE!RaiseException+0x00000058) 
    ExceptionCode: e0434352 (CLR exception) 
    ExceptionFlags: 00000001 
NumberParameters: 5 
    Parameter[0]: 80131500 
    Parameter[1]: 00000000 
    Parameter[2]: 00000000 
    Parameter[3]: 00000000 
    Parameter[4]: 713e0000 

0:000> !pe 
Exception object: 02573148 
Exception type: System.Exception 
Message:   Help! I am unhandled! 
InnerException: <none> 
StackTrace (generated): 
    SP  IP  Function 
    0038F0DC 001D04B4 UnhandledExceptionHandler!UnhandledExceptionHandler.Program.Main(System.String[])+0x6c 

StackTraceString: <none> 
HResult: 80131500 

Где флаги исключений говорят нам, что это второе исключение.

+0

Для чего это стоит, я очень рад сохранить это. Я использую как C#, так и VB, и вполне может столкнуться с этим снова в будущем. –