如何控制异常弹出行为?

How to control exception pop-up behavior?

提问人:SE12938683 提问时间:8/8/2023 最后编辑:Uwe KeimSE12938683 更新时间:8/8/2023 访问量:49

问:

此对话框(“应用程序中发生了未经处理的异常”)有时会弹出,有时不会弹出。

如何控制是否弹出,或者是否可以控制?

它的默认行为是什么(何时以及弹出哪些异常)?

enter image description here

C# .NET 异常

评论

2赞 Sathish Guru V 8/8/2023
这回答了你的问题吗?WinForms 全局异常处理?
3赞 PMF 8/8/2023
它实际上不应该弹出。如果看到此情况,则表示您未能正确处理应用程序中的异常。
0赞 SE12938683 8/8/2023
@SathishGuruV 不,我只是想知道对话框。

答:

1赞 JonasH 8/8/2023 #1

来自 UnhandledException 事件的文档

从 .NET Framework 4 开始,除非事件处理程序是安全关键型的并且具有 HandleProcessCorruptedStateExceptionsAttribute 属性,否则不会引发破坏进程状态的异常(如堆栈溢出或访问冲突)。

我的猜测是对话框使用了此事件,并且异常类型可能是原因。您可以检查事件日志以调查发生的异常类型,并且可能会发现一些模式。

但这应该是一个裤子着火的情况。无论崩溃的原因是什么,您都需要修复它。有些异常可能需要使用 try/catch 进行处理,而其他异常则从一开始就不应该发生。对于任何事情,依赖框架提供的一些错误对话框都不是一个好主意。

2赞 shingo 8/8/2023 #2

默认情况下,当 UI 线程(主线程 IOW)上抛出异常并且代码未处理该异常时,将弹出该对话框。如果在其他线程上抛出异常,则不会弹出。

可以使用 Application.SetUnhandledExceptionMode 方法覆盖默认行为:

// Your application will exit when there's an exception.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);

Application.ThreadException 事件:

// Nothing will happen unless the exception is re-thrown from the handler.
Application.ThreadException += (sender, e) => { };