前言

上篇文章我提供了一种方案可以供我们捕获单线程程序中的所有未处理异常。但是如果程序是多线程,那么新增线程出现了异常上个方案就无能为力了。本着方案总比问题多的态度,我再给大家提供一种新的方案,供大家参考。

处理多线程程序的全局异常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程序全局异常?(续)的更多相关文章

  1. 如何捕获winform程序全局异常?

    1.在C#中我们如何处理异常? 上面的问题学过C#的问题大家可能都能回答处理,用try-catch-finally具体如下: try { //可能出错的语句 } catch (Exception) { ...

  2. 转:如何捕获winform程序全局异常?

    前言 上篇文章我提供了一种方案可以供我们捕获单线程程序中的所有未处理异常.但是如果程序是多线程,那么新增线程出现了异常上个方案就无能为力了.本着方案总比问题多的态度,我再给大家提供一种新的方案,供大家 ...

  3. 使用Microsoft.ExceptionMessageBox.dll捕获WinForm程序中异常信息并弹窗显示

    WinForm程序开发中,在开发模式下对于异常的处理一般都是通过调试的方式来查找异常发生的未知与原因. 下面以“除数为0”的情况来具体说明. Button按钮事件如下: private void bu ...

  4. winform 记录全局异常捕获

    这篇文章主要是备用 记录winform程序捕获全局异常. /// <summary> /// 应用程序的主入口点. /// </summary> public static A ...

  5. WinForm程序全局捕捉异常处理办法

    如何全局捕捉Winform程序异常呢,当然是从程序启动入口的Program类下的Main()方法定义了,下面看下这个类怎么写的吧 static class Program { static strin ...

  6. c#winform将全局异常抛出,不用大量写try()catch()

    一.在program.cs处完善成如下,但是这样后只能抛出主线程(UI)的错误,所以请看第二步 /// 应用程序的主入口点. /// </summary> [STAThread] stat ...

  7. winform捕捉全局异常

    /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main() { try { //设置应 ...

  8. C#中的那些全局异常捕获

    1.WPF全局捕获异常     public partial class App : Application     {         public App()         {    // 在异 ...

  9. (转)C#中的那些全局异常捕获

    C#中的那些全局异常捕获(原文链接:http://www.cnblogs.com/taomylife/p/4528179.html)   1.WPF全局捕获异常       public partia ...

随机推荐

  1. Nginx+uwsgi+supervisor+Ubuntu+flask

    Nginx+uwsgi+supervisor+Ubuntu+flask Nginx+uwsgi+supervisor在Ubuntu上部署flask应用 网上找了许多讲关于Flask应用部署的文章几乎都 ...

  2. 将HDC保存为BMP文件

    HDC在MSDN中的全称为:The handle of device context.通常,我们都是用来做相应的显示操作.        熟悉WIN32的朋友对于其应该不会陌生,经常采用GetDC,G ...

  3. caffe神经网络框架的辅助工具(将图片转换为leveldb格式)

    caffe中负责整个网络输入的datalayer是从leveldb里读取数据的,是一个google实现的很高效的kv数据库. 因此我们训练网络必须先把数据转成leveldb的格式. 这里我实现的是把一 ...

  4. Eclipse开启与关闭代码自动提示功能

        Eclipse代码里面的代码提示功能默认是关闭的,只有输入“.”的时候才会提示功能,用vs的用户可能不太习惯 这种,vs是输入任何字母都会提示,下面说一下如何修改eclipse配置,开启代码自 ...

  5. portal---easyui

    一,效果图. 二,源代码. <!doctype html><html><head> <meta http-equiv="Content-Type&q ...

  6. 浙江大学2015年校赛B题 ZOJ 3861 Valid Pattern Lock

    这道题目是队友写的,貌似是用暴力枚举出来. 题意:给出一组数,要求这组数在解锁的界面可能的滑动序列. 思路:按照是否能够直接到达建图,如1可以直接到2,但是1不能直接到3,因为中间必须经过一个2. 要 ...

  7. 关于 Oracle外键列上是否需要索引问题?

    外键列上缺少索引会带来两个问题,限制并发性.影响性能.而这两个问题中的任意一个都可能会造成严重性能问题.   无论是Oracle的官方文档,还是在Tom的书中都说明了两种情况下可以忽略外键上的索引.其 ...

  8. kvm libvirt: hostdev passthrough support 解决加密狗冲突问题

    From: "Daniel P. Berrange" <berrange redhat com> To: Guido Günther <agx sigxcpu o ...

  9. ORM框架Hibernate (四) 一对一单向、双向关联映射

    简介 在上一篇博客说了一下多对一映射,这里再说一下一对一关联映射,这种例子在生活中很常见,比如一个人的信息和他的身份证是一对一.又如一夫一妻制等等. 记得在Java编程思想上第一句话是“一切皆对象”, ...

  10. HDU 4814 Golden Radio Base 小模拟

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4814 题意:黄金比例切割点是,如今要求把一个10进制的的数转化成一个phi进制的数,而且不能出现'11'的 ...