我希望为我的WinForms应用程序中任何线程的所有未处理异常设置处理程序方法。我不会自己创建任何应用程序域。
根据UnhandledException文档,我需要通过
在使用Windows窗体的应用程序中,主应用程序线程中的未处理异常会导致引发Application.ThreadException事件。如果已处理此事件,则默认行为是未处理异常不会终止应用程序,尽管应用程序处于未知状态。在这种情况下,不会引发UnhandledException事件。可以通过使用应用程序配置文件或在挂钩ThreadException事件处理程序之前使用Application.SetUnhandledExceptionMode方法将模式更改为UnhandledExceptionMode.ThrowException来更改此行为。这仅适用于主应用程序线程。对于其他线程抛出的未处理异常,将引发UnhandledException事件。
因此,最终代码如下所示:
根据UnhandledException文档,我需要通过
Application.SetUnhandledExceptionMode
方法设置UnhandledExceptionMode.ThrowException
模式来捕获主线程的异常:在使用Windows窗体的应用程序中,主应用程序线程中的未处理异常会导致引发Application.ThreadException事件。如果已处理此事件,则默认行为是未处理异常不会终止应用程序,尽管应用程序处于未知状态。在这种情况下,不会引发UnhandledException事件。可以通过使用应用程序配置文件或在挂钩ThreadException事件处理程序之前使用Application.SetUnhandledExceptionMode方法将模式更改为UnhandledExceptionMode.ThrowException来更改此行为。这仅适用于主应用程序线程。对于其他线程抛出的未处理异常,将引发UnhandledException事件。
因此,最终代码如下所示:
public static void UnhandledExceptionEventHandler(object sender, UnhandledExceptionEventArgs e)
{
// ...
}
[STAThread]
static void Main(string[] args)
{
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionEventHandler);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm(pathToCheck));
}
可以吗?它会捕获所有未处理的异常,包括所有线程(包括主线程、UI线程和由Task
类创建的所有线程)吗? 我是否正确理解了文档?
是的,我看到了像这个的问题,但我不明白为什么我还应该使用以下代码:
Application.ThreadException += new
ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);
SetUnhandledExceptionMode
方法强制UI线程异常,所以我不需要指定ThreadException
处理程序。我是对的吗? - FrozenHeartThreadException
吗? - FrozenHeart