1. 程式人生 > 其它 >WPF全域性異常處理

WPF全域性異常處理

private void RegisterEvents()
{
    //Task執行緒內未捕獲異常處理事件
    TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;//Task異常 
    //UI執行緒未捕獲異常處理事件(UI主執行緒)
    DispatcherUnhandledException += App_DispatcherUnhandledException;
    //非UI執行緒未捕獲異常處理事件(例如自己建立的一個子執行緒)
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}
//Task執行緒內未捕獲異常處理事件
private void TaskScheduler_UnobservedTaskException(object? sender, UnobservedTaskExceptionEventArgs e)
{
    try
    {
        Exception? exception = e.Exception as Exception;
        if (exception != null)
        {
            this.Logger.Error(exception);
        }
    }
    catch (Exception ex)
    {
        this.Logger.Error(ex);
    }
    finally
    {
        e.SetObserved();
    }
}
//非UI執行緒未捕獲異常處理事件(例如自己建立的一個子執行緒)      
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    try
    {
        var exception = e.ExceptionObject as Exception;
        if (exception != null)
        {
            this.Logger.Error(exception);
        }
    }
    catch (Exception ex)
    {
        this.Logger.Error(ex);
    }
    finally
    {
        //ignore
    }
}
//UI執行緒未捕獲異常處理事件(UI主執行緒)
private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
    try
    {
        this.Logger.Error(e.Exception);
    }
    catch (Exception ex)
    {
        this.Logger.Error(ex);
    }
    finally
    {
        e.Handled = true;
    }
}