问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

让异常无处可逃:在 WinForms 中统一处理未捕获的异常

创作时间:
作者:
@小白创作中心

让异常无处可逃:在 WinForms 中统一处理未捕获的异常

引用
1
来源
1.
https://www.clicksun.com.cn/mis/bbs/showbbs.asp?id=28532

在开发WinForms桌面应用程序时,未捕获的异常可能会导致程序突然崩溃,给用户带来糟糕的体验。为了避免这种情况的发生,我们需要在应用程序中设置一个全局的异常处理机制。本文将详细介绍如何为WinForms应用程序实现统一的异常处理。

步骤一:创建项目和界面

  1. 创建一个新的WinForms项目,命名为"ExceptionHandlerDemo"。
  2. 在默认的Form1窗体上添加一个Button控件,并将按钮的Text属性设置为"抛出异常"。

步骤二:添加引发异常的代码

在按钮的Click事件中,我们故意抛出一个异常:

private void button1_Click(object sender, EventArgs e)
{
    throw new InvalidOperationException("这是一个测试异常!");
}

步骤三:订阅全局异常事件

为了捕获所有未处理的异常,我们需要订阅Application.ThreadExceptionAppDomain.CurrentDomain.UnhandledException事件。在Program.cs文件中添加以下代码:

internal static class Program
{
    [STAThread]
    static void Main()
    {
        ApplicationConfiguration.Initialize();
        // 订阅 ThreadException 事件,用于捕获 UI 线程上的未捕获异常
        Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
        // 设置未经处理的异常模式,以便在非 UI 线程上也能捕获异常
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
        // 订阅 UnhandledException 事件,用于捕获所有线程上的未捕获异常
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        Application.Run(new Form1());
    }

    // 处理 UI 线程上的未捕获异常
    private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
    {
        HandleException(e.Exception);
    }

    // 处理所有线程上的未捕获异常
    private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        HandleException(e.ExceptionObject as Exception);
    }

    // 统一的异常处理方法
    private static void HandleException(Exception ex)
    {
        if (ex == null) return;
        // 记录错误日志
        // 显示友好的错误信息给用户
        MessageBox.Show(@"
对不起,应用程序遇到了一个问题,错误信息如下:
{ex.Message}
我们已经记录了这个问题,稍后会进行修复。",
                        "应用程序错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        // (可选)退出应用程序或采取其他措施
        Application.Exit();
    }
}

步骤四:测试代码

按Ctrl+F5编译并运行程序,然后点击按钮引发异常,你应该会看到一个友好的错误提示框,显示捕获到的异常信息。

总结

通过在WinForms应用程序中设置全局异常处理器,我们可以捕获并优雅地处理所有未被捕获的异常,无论是UI线程还是其他线程的异常,避免那些令人头疼的崩溃,提升用户体验。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号