使用 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 的行为是预期的。
- 执行了未处理的异常处理程序(您可以通过查看控制台输出来验证)
- 进程将终止,因为您无法将异常设置为在处理程序中处理
- 在进程终止之前,调试器跳入
同样的情况不仅发生在 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
异常标志告诉我们这是第二次机会异常。
我有一个 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 的行为是预期的。
- 执行了未处理的异常处理程序(您可以通过查看控制台输出来验证)
- 进程将终止,因为您无法将异常设置为在处理程序中处理
- 在进程终止之前,调试器跳入
同样的情况不仅发生在 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
异常标志告诉我们这是第二次机会异常。