如何捕获winform程序全局异常?(续)
前言
上篇文章我提供了一种方案可以供我们捕获单线程程序中的所有未处理异常。但是如果程序是多线程,那么新增线程出现了异常上个方案就无能为力了。本着方案总比问题多的态度,我再给大家提供一种新的方案,供大家参考。
处理多线程程序的全局异常demo
好了下面直接上代码:
using System;
using System.Security.Permissions;
using System.Threading;
using System.Windows.Forms; namespace TestManyThreadException
{
static class Program
{
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)]
static void Main()
{
ThreadExceptionHandler handler = new ThreadExceptionHandler();
// 设置没有没捕获的异常在这里强制被捕获
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.Automatic);
// 注册UI线程异常事件
Application.ThreadException += handler.Form1_UIThreadException;
//注册非ui线程异常事件
AppDomain.CurrentDomain.UnhandledException +=handler.CurrentDomain_UnhandledException;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
} internal class ThreadExceptionHandler
{
/// <summary>
/// 捕获UI线程的异常
/// </summary>
/// <param name="sender"></param>
/// <param name="t"></param>
public void Form1_UIThreadException(object sender, ThreadExceptionEventArgs t)
{
DialogResult result = DialogResult.Cancel;
try
{
result = ShowThreadExceptionDialog("Windows Forms UI错误", t.Exception);
}
catch
{
try
{
MessageBox.Show("严重的错误",
"Windows Forms UI错误", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
} // 点中止时退出程序
if (result == DialogResult.Abort)
Application.Exit();
} /// <summary>
/// 捕获非ui线程的异常,
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
DialogResult result = DialogResult.Cancel;
try
{
Exception ex = (Exception)e.ExceptionObject;
result = ShowThreadExceptionDialog("非UI线程错误", ex);
}
catch (Exception exc)
{
try
{
MessageBox.Show("严重的非UI线程错误:" + exc.Message, "非UI线程错误", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
}
// 点中止时退出程序
if (result == DialogResult.Abort)
Application.Exit();
} /// <summary>
/// 创建错误信息并显示
/// </summary>
/// <param name="title"></param>
/// <param name="e"></param>
/// <returns></returns>
private DialogResult ShowThreadExceptionDialog(string title, Exception e)
{
string errorMsg = "应用程序错误,请联系管理员," +
"错误信息:\n\n";
errorMsg = errorMsg + e.Message + "\n\nStack Trace:\n" + e.StackTrace;
//在这边记下日志,一般情况下我们可以自定义日志 TODO
return MessageBox.Show(errorMsg, title, MessageBoxButtons.AbortRetryIgnore,
MessageBoxIcon.Stop);
}
}
}
using System;
using System.Threading;
using System.Windows.Forms; namespace TestManyThreadException
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, System.EventArgs e)
{
throw new IndexOutOfRangeException("无效的异常操作");
} private void button2_Click(object sender, System.EventArgs e)
{
Thread th = new Thread(new ThreadStart(ThreadStart1));
th.Start();
}
private void ThreadStart1()
{
throw new FormatException("多线程异常,格式异常");
}
}
}
好了,运行上面的代码,直接点击button2,然后就会出现如下界面:
[caption id="attachment_1229" align="alignnone" width="871"]
捕获全局异常2[/caption]
button1的按钮结果就展示了,上篇文章中已经展示过了。这次仅仅是新增了非UI线程的代码而已。
总结
本文提供了,为winform程序捕获全局异常的一个方案,希望对大家有所帮助。如果你有更好的方案欢迎大家在这里提出来我们共同思考。
上面这两篇文章都是我们研究.NET Framework类库的结果,直接那个类提供了那个事件,供我们使用,所以我们以后还要经常研究net Framework的类库。
如何捕获winform程序全局异常?(续)的更多相关文章
- 如何捕获winform程序全局异常?
1.在C#中我们如何处理异常? 上面的问题学过C#的问题大家可能都能回答处理,用try-catch-finally具体如下: try { //可能出错的语句 } catch (Exception) { ...
- 转:如何捕获winform程序全局异常?
前言 上篇文章我提供了一种方案可以供我们捕获单线程程序中的所有未处理异常.但是如果程序是多线程,那么新增线程出现了异常上个方案就无能为力了.本着方案总比问题多的态度,我再给大家提供一种新的方案,供大家 ...
- 使用Microsoft.ExceptionMessageBox.dll捕获WinForm程序中异常信息并弹窗显示
WinForm程序开发中,在开发模式下对于异常的处理一般都是通过调试的方式来查找异常发生的未知与原因. 下面以“除数为0”的情况来具体说明. Button按钮事件如下: private void bu ...
- winform 记录全局异常捕获
这篇文章主要是备用 记录winform程序捕获全局异常. /// <summary> /// 应用程序的主入口点. /// </summary> public static A ...
- WinForm程序全局捕捉异常处理办法
如何全局捕捉Winform程序异常呢,当然是从程序启动入口的Program类下的Main()方法定义了,下面看下这个类怎么写的吧 static class Program { static strin ...
- c#winform将全局异常抛出,不用大量写try()catch()
一.在program.cs处完善成如下,但是这样后只能抛出主线程(UI)的错误,所以请看第二步 /// 应用程序的主入口点. /// </summary> [STAThread] stat ...
- winform捕捉全局异常
/// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main() { try { //设置应 ...
- C#中的那些全局异常捕获
1.WPF全局捕获异常 public partial class App : Application { public App() { // 在异 ...
- (转)C#中的那些全局异常捕获
C#中的那些全局异常捕获(原文链接:http://www.cnblogs.com/taomylife/p/4528179.html) 1.WPF全局捕获异常 public partia ...
随机推荐
- How do I Find Out Linux CPU Utilization?
From:http://www.cyberciti.biz/tips/how-do-i-find-out-linux-cpu-utilization.html Whenever a Linux sys ...
- Android 6.0 新特性 整理 资料来自网络
Android 6.0新特性 Runtime Permissions Doze and App Standby Apache HTTP Client Removal BoringSSL Access ...
- java.lang.ClassNotFoundException: javax.servlet.Filter
java.lang.ClassNotFoundException: javax.servlet.Filter:有两个原因:(1)在maven中的作用域,不能是provided,需要是compile就是 ...
- ZIOZIA_百度百科
ZIOZIA_百度百科 ZIOZIA
- poj 1080 zoj 1027(最长公共子序列变种)
http://poj.org/problem?id=1080 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=27 /* zoj ...
- 基于CAShapeLayer和贝塞尔曲线的圆形进度条动画【装载】
初次接触CAShapeLayer和贝塞尔曲线,看了下极客学院的视频.对初学者来说感觉还不错.今天来说一个通过CAShapeLayer和贝塞尔曲线搭配的方法,创建的简单的圆形进度条的教程先简单的介绍下C ...
- C#_会员管理系统:开发六(数据搜索)
增加界面中的搜索功能 会员资料管理界面(VIPManager.cs): 详细代码如下: using System; using System.Collections.Generic; using Sy ...
- iOS中NSString转换成HEX(十六进制)-NSData转换成int
http://www.2cto.com/kf/201402/281501.html 1 2 3 4 5 6 NSString *str = @"0xff055008"; //先以1 ...
- Spring+EhCache缓存实例(详细讲解+源码下载)(转)
一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...
- mojo 接口返回键值对的json格式
my $c = shift; use DBI; my %hash=(); my $dbUser='zabbix'; my $user="root"; my $passwd=&quo ...