让异常无处可逃:在 WinForms 中统一处理未捕获的异常
创作时间:
作者:
@小白创作中心
让异常无处可逃:在 WinForms 中统一处理未捕获的异常
引用
1
来源
1.
https://www.clicksun.com.cn/mis/bbs/showbbs.asp?id=28532
在开发WinForms桌面应用程序时,未捕获的异常可能会导致程序突然崩溃,给用户带来糟糕的体验。为了避免这种情况的发生,我们需要在应用程序中设置一个全局的异常处理机制。本文将详细介绍如何为WinForms应用程序实现统一的异常处理。
步骤一:创建项目和界面
- 创建一个新的WinForms项目,命名为"ExceptionHandlerDemo"。
- 在默认的Form1窗体上添加一个Button控件,并将按钮的Text属性设置为"抛出异常"。
步骤二:添加引发异常的代码
在按钮的Click事件中,我们故意抛出一个异常:
private void button1_Click(object sender, EventArgs e)
{
throw new InvalidOperationException("这是一个测试异常!");
}
步骤三:订阅全局异常事件
为了捕获所有未处理的异常,我们需要订阅Application.ThreadException
和AppDomain.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线程还是其他线程的异常,避免那些令人头疼的崩溃,提升用户体验。
热门推荐
治愈路上的“荆棘”—HIV病毒储存库
黄酒发酵特点:从传统工艺到二次发酵
【以案释法】套现出借有风险,小心刑责找上你
Minimax算法(极小化极大算法)及实例讲解
CPU主频和睿频的区别与联系
未经他人允许可以录音吗
父母必读:如何引导女儿走好婚姻路
烟花爆竹企业安全培训记录:提升员工安全意识的关键步骤
TFT显示屏偶发无法点亮
死亡导乐给走到生命尽头的人带来安慰
少林寺、黄河、烩面……7个关键词带你领略郑州魅力!
运动结束后,千万不要忽略了拉伸,它的好处超乎你的想象
楼梯台阶的设计原则及注意事项
央行暂停买入国债,机构预测上半年债市或面临调整风险
自然保护区,如何实现高水平保护?
天才的代价:菲利普·K·迪克的幻梦人生
发光二极管正负极判断方法详解
如何正确理解和计算理财基金收益?这种收益的计算方法有哪些局限性?
那些经常关灯看手机的人,后来都怎么样了?
台式机CPU和散热器安装详解,看似简单却难倒很多高人
长胶是最好的陪练,业余乒乓球爱好者巧练搓球和拉球技术
直拍长胶3种典型打法介绍,反胶选手的应对策略及战术调整
冰糖葫芦熬糖方法:让你轻松做出香甜脆爽的经典小吃
在家自制嘎嘣脆的冰糖葫芦:详细步骤及关键技巧
第三次生物科技革命?合成生物学会带来哪些巨变?
医护入户检测两百余家庭后提醒:除尘螨别漏了靠垫、学习椅
Excel中MOD函数的使用方法与实战案例
煮粥米要泡多久?不同米种的浸泡时间全攻略
太阳系中八大行星都有什么特点?
揭秘KVA和KW的区别与换算及视在功率、有功功率、无功功率的关系