WPF 全局异常捕获

181次阅读
没有评论

共计 1394 个字符,预计需要花费 4 分钟才能阅读完成。

在 APP.xaml.cs 文件中写以下代码:
/// <summary>
/// App.xaml 的交互逻辑
/// </summary>
public partial class App : Application
{public App()
    {this.Startup += new StartupEventHandler(App_Startup); // 注册开始事件

        this.Exit += new ExitEventHandler(App_Exit);          // 注册退出事件
    }

    // 进程启动
    private void App_Startup(object sender, StartupEventArgs e)
    {
        // UI 线程未捕获异常处理事件
        DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(Startup_DispatcherUnhandledException);

        //Task 线程内未捕获异常处理事件
        TaskScheduler.UnobservedTaskException += Startup_UnobservedTaskException;

        // 非 UI 线程未捕获异常处理事件
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(Startup_UnhandledException);
    }

    private void Startup_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        try
        {
            // 把 Handled 属性设为 true,表示此异常已处理,程序可以继续运行,不会强制退出
            e.Handled = true;

            // 这里可以写一下错误日志
        }
        catch (Exception ex)
        {
            // 此时程序出现严重异常,将强制结束退出

            // 这里可以写一下错误日志

            MessageBox.Show(" 程序发生致命错误,将终止!", "BUG");
        }
    }

    private void Startup_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
    { }

    private void Startup_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {StringBuilder sbEx = new StringBuilder();

        if (e.IsTerminating)
        {sbEx.Append(" 程序发生致命错误,将终止!\n");
        }

        sbEx.Append(" 捕获未处理异常:");

        if (e.ExceptionObject is Exception)
        {sbEx.Append(((Exception)e.ExceptionObject).Message);
        }
        else
        {sbEx.Append(e.ExceptionObject);
        }

        MessageBox.Show(sbEx.ToString());
    }

    private void App_Exit(object sender, ExitEventArgs e)
    {// 程序退出时需要处理的业务}
}

正文完
 0
flames
版权声明:本站原创文章,由 flames 于2021-03-15发表,共计1394字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)