WinForm捕获全局异常(捕获未处理的异常)
背景
我们在做WinForm程序的时候,一般都是对异常进行处理,但是,我们要防止不小心出现未知异常,导致软件崩溃。也可采集系统未知的异常信息,防止出现异常,也无法下手。于是就有了如这篇文章标题所述的一个简单的需求。
代码实现
1、处理未捕获的异常
/// <summary>///这就是我们要在发生未处理异常时处理的方法,我这是写出错详细信息到文本,如出错后弹出一个漂亮的出错提示窗体,给大家做个参考///做法很多,可以是把出错详细信息记录到文本、数据库,发送出错邮件到作者信箱或出错后重新初始化等等///这就是仁者见仁智者见智,大家自己做了。/// </summary>/// <param name="sender"></param>/// <param name="e"></param>static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {string str = "";string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";Exception error = e.Exception as Exception;if (error != null) {str = string.Format(strDateInfo + "异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n",error.GetType().Name, error.Message, error.StackTrace);}else {str = string.Format("应用程序线程错误:{0}", e);}Helper.GetInstance().PlanLog(str, LogType.应用程序异常.ToString()); //frmBug f = new frmBug(str);//友好提示界面//f.ShowDialog();MessageBox.Show("发生致命错误,请及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);}
2、处理UI线程异常
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {string str = "";Exception error = e.ExceptionObject as Exception;string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";if (error != null) {str = string.Format(strDateInfo + "Application UnhandledException:{0};\n\r堆栈信息:{1}", error.Message, error.StackTrace);}else {str = string.Format("Application UnhandledError:{0}", e);}Helper.GetInstance().PlanLog(str, LogType.应用程序异常.ToString()); //frmBug f = new frmBug(str);//友好提示界面//f.ShowDialog();MessageBox.Show("发生致命错误,请停止当前操作并及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);}
3、处理非UI线程异常
/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main() {try {//可定义多个线程Thread _UserMessageThread; _UserMessageThread = new Thread(new ThreadStart(LoginManager.GetInstance().test));_UserMessageThread.IsBackground = true;_UserMessageThread.Start();//处理未捕获的异常 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);//处理UI线程异常 Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);//处理非UI线程异常 AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Xw.Common.Sys.SysConfig.AppExwcutePath = Application.ExecutablePath;Xw.Common.Sys.SysConfig.AppStartPath = Application.StartupPath;Xw.Common.Sys.SysConfig.Version = "V1.0.0";Xw.Common.Sys.SysConfig.SoftFullName = "拍鞋网";Xw.Common.Sys.SysConfig.SoftName = "软件园店";if (!Xw.Common.Sys.SysConfig.IsOnlyRunSoft("PaiXie.Pos.Client")) {Xw.Common.Sys.MsgBoxWin.ShowInformation("该程序已运行!");return;}Application.Run(new Login());}catch (Exception ex) {string str = "";string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";if (ex != null) {str = string.Format(strDateInfo + "异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n",ex.GetType().Name, ex.Message, ex.StackTrace);}else {str = string.Format("应用程序线程错误:{0}", ex);}Helper.GetInstance().PlanLog(str, LogType.应用程序异常.ToString()); //frmBug f = new frmBug(str);//友好提示界面//f.ShowDialog();MessageBox.Show("发生致命错误,请及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);} }
完整代码
using PaiXie.Pos.Client.Core;
using PaiXie.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
namespace PaiXie.Pos.Client {static class Program {/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main() {try {//可定义多个线程Thread _UserMessageThread; _UserMessageThread = new Thread(new ThreadStart(LoginManager.GetInstance().test));_UserMessageThread.IsBackground = true;_UserMessageThread.Start();//处理未捕获的异常 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);//处理UI线程异常 Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);//处理非UI线程异常 AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Xw.Common.Sys.SysConfig.AppExwcutePath = Application.ExecutablePath;Xw.Common.Sys.SysConfig.AppStartPath = Application.StartupPath;Xw.Common.Sys.SysConfig.Version = "V1.0.0";Xw.Common.Sys.SysConfig.SoftFullName = "拍鞋网";Xw.Common.Sys.SysConfig.SoftName = "软件园店";if (!Xw.Common.Sys.SysConfig.IsOnlyRunSoft("PaiXie.Pos.Client")) {Xw.Common.Sys.MsgBoxWin.ShowInformation("该程序已运行!");return;}Application.Run(new Login());}catch (Exception ex) {string str = "";string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";if (ex != null) {str = string.Format(strDateInfo + "异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n",ex.GetType().Name, ex.Message, ex.StackTrace);}else {str = string.Format("应用程序线程错误:{0}", ex);}Helper.GetInstance().PlanLog(str, LogType.应用程序异常.ToString()); //frmBug f = new frmBug(str);//友好提示界面//f.ShowDialog();MessageBox.Show("发生致命错误,请及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);} }/// <summary>///这就是我们要在发生未处理异常时处理的方法,我这是写出错详细信息到文本,如出错后弹出一个漂亮的出错提示窗体,给大家做个参考///做法很多,可以是把出错详细信息记录到文本、数据库,发送出错邮件到作者信箱或出错后重新初始化等等///这就是仁者见仁智者见智,大家自己做了。/// </summary>/// <param name="sender"></param>/// <param name="e"></param>static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {string str = "";string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";Exception error = e.Exception as Exception;if (error != null) {str = string.Format(strDateInfo + "异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n",error.GetType().Name, error.Message, error.StackTrace);}else {str = string.Format("应用程序线程错误:{0}", e);}Helper.GetInstance().PlanLog(str, LogType.应用程序异常.ToString()); //frmBug f = new frmBug(str);//友好提示界面//f.ShowDialog();MessageBox.Show("发生致命错误,请及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);}static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {string str = "";Exception error = e.ExceptionObject as Exception;string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";if (error != null) {str = string.Format(strDateInfo + "Application UnhandledException:{0};\n\r堆栈信息:{1}", error.Message, error.StackTrace);}else {str = string.Format("Application UnhandledError:{0}", e);}Helper.GetInstance().PlanLog(str, LogType.应用程序异常.ToString()); //frmBug f = new frmBug(str);//友好提示界面//f.ShowDialog();MessageBox.Show("发生致命错误,请停止当前操作并及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);}}
}
总结
针对异常,我们肯定无法事先全部预知,所以进行全局异常捕获还是很有必要的。
-----------------------------------
公众号【Csharp编程大全】,需要进技术群交流的,请添加小编mm1552923!
WinForm捕获全局异常(捕获未处理的异常)相关推荐
- 【CAD异常】未处理的异常C0000005(Access Violation Reading 0x0010),地址:5C6B5587h
win 10环境,CAD2007,添加.arx扩展的时候,报错,错误信息:未处理的异常C0000005(Access Violation Reading 0x0010),地址:5C6B5587h. 解 ...
- java最外层能捕获到异常吗_Java最外层异常的抓取要用Throwable
3月以来,从来运行正常的link无故崩了好多次,现象:无异常日志,用jstack看主线程挂了进程还在,主线程最外层有catch异常,但是并没有打印日志,实在匪夷所思. 先是怀疑socket连接,通过系 ...
- 只针对异常的情况才使用异常_如何以及何时使用异常
只针对异常的情况才使用异常 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. ...
- 【改进】C# WinForm捕获全局异常 SamWang
许多小公司的项目都缺少异常处理模块,我们也是.经常会出现这种情况,用户在UI界面操作,就直接跳出堆栈调用的异常信息对话框,老板看到那叫一个火啊!你们的代码怎么天天出现乱码.呵呵!这就是没有异常捕获处理 ...
- 在C#代码中应用Log4Net(四)在Winform和Web中捕获全局异常
毕竟人不是神,谁写的程序都会有bug,有了bug不可怕,可怕的是出错了,你却不知道错误在哪里.所以我们需要将应用程序中抛出的所有异常都记录起来,不然出了错,找问题就能要了你的命.下面我们主要讨论的是如 ...
- winform程序捕获全局异常,对错误信息写入日志并弹窗
使用场景:在winform程序中如果没对方法进行try catch操作,若方法内出错,则整个程序报错并退出,如下图 如果程序已在客户手中,若没对错误的详细信息进行拍照,我们则不知道错误原因是什么.我们 ...
- WPF捕获全局未处理异常
WPF捕获全局未处理异常 参考文章: (1)WPF捕获全局未处理异常 (2)https://www.cnblogs.com/xiesong/p/7732023.html (3)https://www. ...
- asp.net捕获全局未处理异常的几种方法
通过HttpModule来捕获未处理的异常[推荐] 首先需要定义一个HttpModule,并监听未处理异常,代码如下: public void Init(HttpApplication context ...
- C# winform 捕获全局异常
using System; using System.Collections.Generic; using System.Windows.Forms; using System.IO; namespa ...
最新文章
- input的onchange事件 及只能输入数字实现
- commit 规范性提交
- close与volume的相关性
- linux显示文件开头部分内容,一天一个linux基础命令之查看文件开头部分内容head...
- 手机计算机应用的图片,怎么把手机的照片传到电脑 四种方法轻松导入
- Panel的基本用法
- 计算机毕业设计(附源码)python智慧门诊综合管理系统
- 通过Docker安装L2TP
- 登出系统gif图标_来了!深度操作系统 20正式版——崭新视界,创无止境
- 【RPC】序列化与反序列化
- 分享过几个【贪吃蛇】了,再分享一下也不过分吧?(妙趣横生)
- 毕业论文参考文献引用
- c语言ntc程序,NTC热敏电阻温度计算以及C语言实现
- cesium-加载geoserver发布的tms服务
- 整理总结:《量化交易——如何建立自己的算法交易事业》
- 向量叉乘的右手螺旋定则
- 【ECharts系列|03可视化大屏】大数据管理平台实时展示
- 腾讯云tcp架构认证适合什么人群?费用是多少?需要什么资质能力?
- 官网下载spring步骤(包含全部jar包)
- bem什么意思_BEM规范你应该了解