ThreadException
在windows窗体程序中,使用 ThreadException 事件来处理 UI 线程异常,使用 UnhandledException 事件来处理非 UI 线程异常。ThreadException可以阻止应用程序终止。具体使用方法如下:
[STAThread]
static void Main()
{
Application.ThreadException += new ThreadExceptionEventHandler(UIThreadException);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); //获取该应用程序的名称,判断是否在进程中存在,如果存在,则需要关闭再重新启动
var processName=Process.GetCurrentProcess().ProcessName;
if((Process.GetProcessesByName(aProcessName)).GetUpperBound() > )
{
MessageBox.Show("程序已经启动,需要关闭才能重新开启!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form());
}
}
private static void UIThreadException(object sender, ThreadExceptionEventArgs e)
{
try
{
string errorMsg = "Windows窗体线程异常";
LogUnhandledException(errorMsg,e.Exception);
//MessageBox.Show(errorMsg + e.Exception.Message + Environment.NewLine + e.Exception.StackTrace);
}
catch
{
MessageBox.Show("不可恢复的Windows窗体异常,应用程序将退出!");
}
}
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
try
{
Exception ex = (Exception)e.ExceptionObject;
string errorMsg = "非Windows窗体线程异常";
LogUnhandledException(errorMsg,ex);
//MessageBox.Show(errorMsg + ex.Message + Environment.NewLine + ex.StackTrace);
}
catch
{
MessageBox.Show("不可恢复的非Windows窗体线程异常,应用程序将退出!");
}
} //异常日志处理
private static void LogUnhandledException(string message, Exception ex)
{
string path = AppDomain.CurrentDomain.BaseDirectory+"Logs";
if(path!=null&&path!="")
{
if (!(Directory.Exists(path)))
{
Directory.CreateDirectory(path); //创建日志文件夹
}
path += string.Format(@"\\{0}.log", DateTime.Now.ToString("yyyy-MM-dd")); using (var sw = new StreamWriter(path, true, Encoding.Default))
{
sw.WriteLine("**************************************************************************************");
sw.WriteLine(DateTime.Now.ToString());
if (ex != null)
{
sw.WriteLine("异常信息:");
sw.WriteLine(message);
sw.WriteLine("【Message】" + ex.Message);
sw.WriteLine("【ErrorType】:" + ex.GetType());
sw.WriteLine("【TargetSite】" + ex.TargetSite);
sw.WriteLine("【StackTrace】" + ex.StackTrace);
}
else sw.WriteLine("Exception Is Null");
sw.WriteLine();
}
}
}
ThreadException的更多相关文章
- 转:异常处理之ThreadException、unhandledException及多线程异常处理
转载自:http://www.cnblogs.com/levin9/articles/2319251.html 一:ThreadException和unhandledException的区别 处理未捕 ...
- WinForm 捕获异常 Application.ThreadException + AppDomain.CurrentDomain.UnhandledException
WinForm 捕获未处理的异常,可以使用Application.ThreadException 和AppDomain.CurrentDomain.UnhandledException事件 WinF ...
- Winform异常处理之ThreadException、unhandledException及多线程异常处理
异常处理之ThreadException.unhandledException及多线程异常处理 一:ThreadException和unhandledException的区别 处理未捕获的异常是每个应 ...
- 解析大型.NET ERP系统 设计异常处理模块
异常处理模块是大型系统必备的一个组件,精心设计的异常处理模块可提高系统的健壮性.下面从我理解的角度,谈谈异常处理的方方面面.我的设计仅仅限定于Windows Forms,供参考. 1 定义异常类型 . ...
- 设计C/S架构应用程序的并发功能
C/S架构的ERP.CRM程序有的是以并发点(Concurrency)来销售,并发点是指同时在线人数.并发数量大时,理论上程序的运行速度会慢,软件供应商(vendor)也以控制并发的上限以解决客户对系 ...
- C/S架构应用程序开发培训笔记
最近为客户组织了一项C/S架构程序的开发培训,讲解C/S应用程序开发中需要注意的点. 我主要是做C/S方面的ERP/CRM程序开发,界面是用Windows Forms技术,有遗漏或错误的地方欢迎批评指 ...
- C#异常处理经验(原则与方法)
本文是异常处理经验性的文章,其实跟C#关系也不大.比较适合刚刚熟悉异常语法,而缺乏实战的读者.当然,经验老练的读者也可指出不足.给予意见.补充说明,一起完善文章,分享更多知识与经验. 1 ...
- winform程序一启动抛出异常--调用目标发生异常
在本机测试没有问题,可一到别的电脑上就抛出异常,这是最麻烦的事,一时间还找不出什么原因,本机上还无法重现. 现在好了,终于找到一个完美解决的办法,在Program.cs类中加入如下代码 static ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 10.宿主程序详细设计
目 录 第十章 宿主程序详细设计... 2 10.1 配置文件设计... 3 10.2 加载设备驱动... 4 10.3 加载 ...
随机推荐
- c# 线程同步各类锁
1)原子操作(Interlocked):所有方法都是执行一次原子读取或一次写入操作. 2)lock()语句:避免锁定public类型,否则实例将超出代码控制的范围,定义private对象来锁定. 3) ...
- MINA线程模型
一.三种工作线程: (一) Acceptor thread: 该线程的作用是接收客户端的连接,并将客户端的连接导入到IOProcessor线程模型中.Acceptor thread在调用了Accep ...
- 不能将“this”指针从“const SqQueue<ElementType>”转换为“SqQueue<ElementType> &
错误 1 error C2662: “int SqQueue<ElementType>::getLength(void)”: 不能将“this”指针从“const SqQueue<E ...
- Linux下处理文件中的^M
由于之前爬某房地产网站的房价数据,开始没有定义好存储的位子,所以临时存储在了txt文件中.最近定义清楚数据需要存储在mongoDB中,所以我需要从原来数据中解析出来存储在mongoDB中,转存的时候在 ...
- LOJ 3056 「HNOI2019」多边形——模型转化+树形DP
题目:https://loj.ac/problem/3056 只会写暴搜.用哈希记忆化之类的. #include<cstdio> #include<cstring> #incl ...
- Hadoop数据分析实例:P2P借款人信用风险实时监控模型设计
Hadoop数据分析实例:P2P借款人信用风险实时监控模型设计 一提到hadoop相信熟悉IT领域或者经常关注互联网新闻的朋友都应该很熟悉了,当然,这种熟悉可能也只是听着名字耳熟,但并不知道它具体是什 ...
- linux mv命令详解
Linux mv命令 Linux mv命令用来为文件或目录改名.或将文件或目录移入其它位置. 用法: mv [选项]... [-T] 源文件 目标文件 mv [选项]... 源文件... 目录 mv ...
- ES Terms 聚合数据不确定性
Elasticsearch是一个分布式的搜索引擎,每个索引都可以有多个分片,用来将一份大索引的数据切分成多个小的物理索引,解决单个索引数据量过大导致的性能问题,另外每个shard还可以配置多个副本,来 ...
- MMCM与PLL
MMCM与PLL 1.the clock management title(CMT) 弄清楚BUFR, IBUFG,BUFG,GT,BUFH,是什么. 2.MMCM内部结构 3.PLL内部结构 4 ...
- Windows Phone Splash Screen
Why to use splash screen? Typically, you should use a splash screen in your app only if your app is ...