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);}}
}

总结

针对异常,我们肯定无法事先全部预知,所以进行全局异常捕获还是很有必要的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

it's so cold

今晚值日&#xff0c;本来中午不冷的&#xff0c;就换了衬衫&#xff0c;结果傍晚的时候就很凉&#xff0c;吃过晚饭只好回去换了件秋天的棉衫。但晚上我值日的那个地方风很大&#xff0c;熬了一节课&#xff0c;下课学生来打乒乓&#xff0c;借了件他们的校服穿&#xff0c;结…

java 继承 冒号_java继承(extends)简单介绍

继承相信很多人都有听说过&#xff0c;继承是面向对象的三个基本特征之一&#xff0c;下面的话就一起通过简单的文章来对java继承进行一下了解吧。继承和现实生活中的“继承”的相似之处是保留一些父辈的特性&#xff0c;从而减少代码冗余&#xff0c;提高程序运行效率。Java中…

如何在 ASP.NET Core 中写出更干净的 Controller

你可以遵循一些最佳实践来写出更干净的 Controller&#xff0c;一般我们称这种方法写出来的 Controller 为瘦Controller&#xff0c;瘦 Controller 的好处在于拥有更少的代码&#xff0c;更加单一的职责&#xff0c;也便于阅读和维护&#xff0c;而且随着时间的推移也容易做 Co…

探索 .NET团队对API的设计流程

原文作者&#xff1a;steve gordon 原文链接: https://www.stevejgordon.co.uk/how-are-dotnet-apis-designed在这篇文章中&#xff0c;我想介绍一些我觉得非常有趣的东西&#xff0c;.NET 团队是如何设计API的&#xff1f;我们先来看下.NET团队面临的有哪些挑战&#xff0c;您…

静态页面的值传递

1两窗口之间存在着关系.父窗口parent.htm打开子窗口son.htm子窗口可以通过window.opener指向父窗口.这样可以访问父窗口的对象. 优点:取值方便.只要window.opener指向父窗口,就可以访问所有对象. 不仅可以访问值,还可以访问父窗口的方法.值长度无限制.缺点:两窗口要存在着…

java类同步_Java中方法,对象,类的同步

关于在多线程环境中使用同步,我需要一些澄清.我在下面有一个小例子类.但我实际上发现很难做出以下内容如何工作的测试用例;我想要测试用例的原因是要了解同步如何处理这些不同的场景>如果一个线程调用SharedResource.staticMethod,它将获取该类的锁.它是否意味着一个SharedR…

ocelot 中间件的变化

ocelot 中间件的变化Intro之前我们使用 ocelot 的时候自定义了一些中间件来实现我们定制化的一些需求&#xff0c;最近博客园上有小伙伴问我怎么使用&#xff0c;他用的版本是 16.0 版本&#xff0c;16.0 和 17.0 版本的差异不是特别大&#xff0c;就以 17.0 版本为例看一下 oc…

mybatis mysql usegeneratedkeys_mybatis中useGeneratedKeys用法--插入数据库后获取主键值

前言&#xff1a;今天无意在mapper文件中看到useGeneratedKeys这个词&#xff0c;好奇就查了下&#xff0c;发现能解决我之前插入有外键表数据时&#xff0c;这个外键获取繁琐的问题&#xff0c;于是学习敲DEMO记录在项目中经常需要获取到插入数据的主键来保障后续操作&#xf…

Istio 知多少 | 下一代微服务的守护者

1. 引言在写完eShopOnContainers 知多少[12]&#xff1a;Envoy gateways后&#xff0c;就一直想进一步探索Service Mesh&#xff0c;最近刚在极客时间上学完《Service Mesh入门》&#xff0c;又大致浏览了一遍官方文档&#xff0c;对Istio也算有了基本的认识。下面就根据自己的…

微软家也会出错

下图是2006年2月8日微软WebCast首页的截图转载于:https://www.cnblogs.com/mssite/archive/2006/02/08/327130.html

mysql 基础视图_MySQL基础(4) | 视图

MySQL基础(4) | 视图基本语法1.创建CREATE VIEW AS 语法说明如下。&#xff1a;指定视图的名称。该名称在数据库中必须是唯一的&#xff0c;不能与其他表或视图同名。&#xff1a;指定创建视图的 SELECT 语句&#xff0c;可用于查询多个基础表或源视图。对于创建视图中的 SELEC…

C# 中的 null 包容运算符 “!” —— 概念、由来、用法和注意事项

在 2020 年的最后一天&#xff0c;博客园发起了一个开源项目&#xff1a;基于 .NET 的博客引擎 fluss&#xff0c;我抽空把源码下载下来看了下&#xff0c;发现在属性的定义中&#xff0c;有很多地方都用到了 null!&#xff0c;如下图所示&#xff1a;这是什么用法呢&#xff1…

[转]不找情人的七种理由(献给已婚的男人)

献给已婚的男人不找情人的七种理由   好像有个曾一度风靡的短信&#xff0c;“结婚是错误,离婚是觉悟,婚外恋是醒悟,再婚是执迷不悟,没有情人是废物,情人太多是动物。”咱不怕犯错误&#xff0c;可没办法不当废物&#xff0c;三十好几还没混上个情人&#xff0c;想起来就惭…

无法初始化java类_myeclip运行java程序不能初始化类 NoClassDefFoundError

引用 3 楼 Menglinyang 的回复:是就这个项目有问题还是所有的都是这样&#xff1f;package cn.itcast.utils;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.…

C#学习笔记(十四):StatusBar控件

状态栏控件StatusBar<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />StatusBar的一些常用属性&#xff1a;名称可用性描述BackgroundImage读写可以给状态栏赋予一个图像&#xff0c;显示在背景上。Panels只读这是状态栏上的面板…

微前端架构在容器平台的应用

源宝导读&#xff1a;随着业务的发展&#xff0c;天际-星舟平台未来需要解决与其他云共创共建&#xff0c;跨团队高效协作等诸多问题&#xff0c;而星舟现有的技术架构将难以支撑。本文将介绍星舟平台如何通过向更先进的“微前端”架构演进落地&#xff0c;以应对将来快速增长的…

java八皇后问题穷举算法_穷举法和回溯法解n皇后问题

八皇后问题是一个以国际象棋为背景的问题&#xff1a;如何能够在88的国际象棋棋盘上放置八个皇后&#xff0c;使得任何一个皇后都无法直接吃掉其他的皇后&#xff1f;为了达到此目的&#xff0c;任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇…

Microsoft PHP.Net ?

居然发现老外有个项目在把PHP搞成象。NET那样咯&#xff0c;核心是Framework 上把 PHP 编译为MSIL。居然见http://www.php-compiler.net/&#xff0c;而且今年居然还FINAL 1.0出来了&#xff0c;这对象把PHP放到.NET平台上来的人说是好消息。20 February 2006: Phalanger versi…

巧用 Lazy 解决.NET Core中的循环依赖关系

原文作者: Thomas Levesque 原文链接&#xff1a;https://thomaslevesque.com/2020/03/18/lazily-resolving-services-to-fix-circular-dependencies-in-net-core/循环依赖的问题在构建应用程序时&#xff0c;良好的设计应该应避免服务之间的循环依赖, 循环依赖是指某些组件直接…

绝句

新世纪“绝”句上联:男生&#xff0c;女生&#xff0c;穷书生&#xff0c;生生不息&#xff01; 下联:初恋&#xff0c;热恋&#xff0c;婚外恋&#xff0c;恋恋不舍!横批&#xff1a;生无可恋 上联:博士生&#xff0c;研究生&#xff0c;本科生&#xff0c;生生不息&#xff…