在多线程环境中使用AppDomain.UnhandledException
本文关键字:AppDomain UnhandledException 多线程 环境 | 更新日期: 2023-09-27 18:28:17
我想检查是否可以在同一个地方捕获所有未处理的异常。
我看到有AppDomain.UnhandledException
。
我是这样用的:
public void MainMethod()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
new Thread()...
}
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
{
Exception e = (Exception)args.ExceptionObject;
LogFile.Log("MyHandler caught : " + e.Message);
}
当未处理的异常发生在主线程中,但在内部线程中它没有捕获时,这就起作用
是否可以在同一位置捕获所有线程的异常,或者我必须将其封装在每个线程上?
我们使用这种方法,试试看:
private static void SetupExceptionHandling()
{
// Add the event handler for handling UI thread exceptions to the event.
Application.ThreadException += ApplicationThreadException;
// Set the unhandled exception mode to force all Windows Forms errors to go through our handler.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
// Add the event handler for handling non-UI thread exceptions to the event.
AppDomain.CurrentDomain.UnhandledException += AppDomainUnhandledException;
// This AppDomain-wide event provides a mechanism to prevent exception escalation policy (which, by default, terminates the process) from triggering.
// Each handler is passed a UnobservedTaskExceptionEventArgs instance, which may be used to examine the exception and to mark it as observed.
TaskScheduler.UnobservedTaskException += TaskSchedulerUnobservedTaskException;
// Add the event handler for handling UI thread exceptions to the event.
Dispatcher.CurrentDispatcher.UnhandledException += DispatcherUnhandledException;
}