背景

我们在做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捕获全局异常(捕获未处理的异常)相关推荐

  1. 【CAD异常】未处理的异常C0000005(Access Violation Reading 0x0010),地址:5C6B5587h

    win 10环境,CAD2007,添加.arx扩展的时候,报错,错误信息:未处理的异常C0000005(Access Violation Reading 0x0010),地址:5C6B5587h. 解 ...

  2. java最外层能捕获到异常吗_Java最外层异常的抓取要用Throwable

    3月以来,从来运行正常的link无故崩了好多次,现象:无异常日志,用jstack看主线程挂了进程还在,主线程最外层有catch异常,但是并没有打印日志,实在匪夷所思. 先是怀疑socket连接,通过系 ...

  3. 只针对异常的情况才使用异常_如何以及何时使用异常

    只针对异常的情况才使用异常 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. ...

  4. 【改进】C# WinForm捕获全局异常 SamWang

    许多小公司的项目都缺少异常处理模块,我们也是.经常会出现这种情况,用户在UI界面操作,就直接跳出堆栈调用的异常信息对话框,老板看到那叫一个火啊!你们的代码怎么天天出现乱码.呵呵!这就是没有异常捕获处理 ...

  5. 在C#代码中应用Log4Net(四)在Winform和Web中捕获全局异常

    毕竟人不是神,谁写的程序都会有bug,有了bug不可怕,可怕的是出错了,你却不知道错误在哪里.所以我们需要将应用程序中抛出的所有异常都记录起来,不然出了错,找问题就能要了你的命.下面我们主要讨论的是如 ...

  6. winform程序捕获全局异常,对错误信息写入日志并弹窗

    使用场景:在winform程序中如果没对方法进行try catch操作,若方法内出错,则整个程序报错并退出,如下图 如果程序已在客户手中,若没对错误的详细信息进行拍照,我们则不知道错误原因是什么.我们 ...

  7. WPF捕获全局未处理异常

    WPF捕获全局未处理异常 参考文章: (1)WPF捕获全局未处理异常 (2)https://www.cnblogs.com/xiesong/p/7732023.html (3)https://www. ...

  8. asp.net捕获全局未处理异常的几种方法

    通过HttpModule来捕获未处理的异常[推荐] 首先需要定义一个HttpModule,并监听未处理异常,代码如下: public void Init(HttpApplication context ...

  9. C# winform 捕获全局异常

    using System; using System.Collections.Generic; using System.Windows.Forms; using System.IO; namespa ...

最新文章

  1. input的onchange事件 及只能输入数字实现
  2. commit 规范性提交
  3. close与volume的相关性
  4. linux显示文件开头部分内容,一天一个linux基础命令之查看文件开头部分内容head...
  5. 手机计算机应用的图片,怎么把手机的照片传到电脑 四种方法轻松导入
  6. Panel的基本用法
  7. 计算机毕业设计(附源码)python智慧门诊综合管理系统
  8. 通过Docker安装L2TP
  9. 登出系统gif图标_来了!深度操作系统 20正式版——崭新视界,创无止境
  10. 【RPC】序列化与反序列化
  11. 分享过几个【贪吃蛇】了,再分享一下也不过分吧?(妙趣横生)
  12. 毕业论文参考文献引用
  13. c语言ntc程序,NTC热敏电阻温度计算以及C语言实现
  14. cesium-加载geoserver发布的tms服务
  15. 整理总结:《量化交易——如何建立自己的算法交易事业》
  16. 向量叉乘的右手螺旋定则
  17. 【ECharts系列|03可视化大屏】大数据管理平台实时展示
  18. 腾讯云tcp架构认证适合什么人群?费用是多少?需要什么资质能力?
  19. 官网下载spring步骤(包含全部jar包)
  20. bem什么意思_BEM规范你应该了解

热门文章

  1. jsp外贸合同信息管理系统
  2. 百度地图开发(七)方向传感器指向方向--指南针
  3. 微软IE7更多细节大揭密(转)
  4. 新书推荐 |《5G NR物理层技术详解:原理、模型和组件》
  5. XQuartz的使用
  6. 【DSP】TMS320F28335的ADC模块
  7. web前端工程师不同级别分别掌握哪些技能
  8. 智能交通大数据分析系统-实现功能
  9. 直播系统源码如何对直播平台进行搭建?
  10. 成都夏季招聘会IT行业缺口大!