使用 Visual Studio 2013 Ultimate 调试时允许 UnhandledException 事件处理程序 运行

Allow UnhandledException event handler to run when debugging using Visual Studio 2013 Ultimate

我有一个 WinForms 应用程序,它使用 Application.UnhandledException 显示一个对话框来提示用户报告错误。当应用程序发布并单独 运行 时,它工作正常(除了有一个未处理的异常浮动的明显问题)。

为了测试对它的更改,我一直在尝试在单击按钮时抛出异常。不幸的是,调试器妨碍了。它会在异常处中断(这在其他情况下不是问题,因为我想知道出了什么问题)并且不让我继续进入 UnhandledException 处理程序,而是告诉我每次单击继续按钮时异常都未处理。我试过禁用中断任何异常、特定类型的异常和选项屏幕中的 Just My Code 选项都无济于事。

有什么方法可以禁用此行为吗?

根据要求在下面复制代码。它来自沼泽标准、普通或普通的 WinForms 应用程序,在启动表单上只有一个按钮 (ThrowButton)。创建项目时默认启用应用程序框架。

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

在 OP 准备 VB.NET 代码供下载之前,此答案是针对 C# 代码给出的。可能它对某人仍然有用。如果您不同意,请将其标记为非答案。

C# 行为遵循 MSDN steps for exception dispatching,在第 3 步中表示:

... but the process is being debugged, the system notifies the debugger a second time.

考虑像

这样的代码
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

异常标志告诉我们这是第二次机会异常。