在多线程环境中使用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);
}

当未处理的异常发生在主线程中,但在内部线程中它没有捕获时,这就起作用

是否可以在同一位置捕获所有线程的异常,或者我必须将其封装在每个线程上?

在多线程环境中使用AppDomain.UnhandledException

我们使用这种方法,试试看:

    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;
    }