前言

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

处理多线程程序的全局异常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. (IOS)Apple 证书相关

    1.私钥 本地钥匙串程序创建<证书请求文件>(.certSigningRequest),用其向苹果申请下载<证书文件>/<私钥>(.cer),并安装到钥匙串: 团队 ...

  2. 【转】Plotting texts as graphs with R and igraph

    原文转自:http://blog.ynada.com/303 I’ve plotted several word association graphs for this New York Times ...

  3. C# 一些小东东

    在C#中,如果有一个方法我们不想继续使用,需要废弃的时候,可以在该方法前面加上一个[Obsolete]. string[] arr={"a","b"} if $ ...

  4. [移动网关]2G环境下资源下载有一定概率失败,客户端日志显示收到403错误

    2G环境下资源下载有一定概率失败,客户端日志显示收到403错误 问题现象: 测试同学在使用联通号码在移动网络环境下,访问连接得到的response_code出现是403,导致资源读取失败表情显示异常. ...

  5. 在 Windows Azure 网站 (WAWS) 上对 Orchard CMS 使用 Azure 缓存

    编辑人员注释: 本文章由 Windows Azure 网站团队的项目经理 Sunitha Muthukrishna 撰写. 如果您当前的 OrchardCMS 网站在 Windows Azure 网站 ...

  6. ios7下二维码功能的实现

    苹果公司升级到IOS7后自己的PassBook自带二维码扫描功能,所以现在使用二维码功能不需要在借助第三方库了 使用前请先导入AVFoundation.frameWork // //  YHQView ...

  7. java多线程制作计时器

    基本思路: 在类中创建thread 供按钮监听器调用. 界面设计:

  8. (step4.2.1) hdu 1372(Knight Moves——BFS)

    解题思路:BFS 1)马的跳跃方向 在国际象棋的棋盘上,一匹马共有8个可能的跳跃方向,如图1所示,按顺时针分别记为1~8,设置一组坐标增量来描述这8个方向: 2)基本过程 设当前点(i,j),方向k, ...

  9. UI 响应者链

    响应者链  概念: 每一个应用有一个响应者链,我们的视图结构是一个N叉树(一个视图可以有多个子视图,一个子视图同一时刻只有一个父视图),而每一个继承UIResponder的对象都可以在这个N叉树中扮演 ...

  10. HH的军训(容斥)

    1248: HH的军训 时间限制: 1 Sec  内存限制: 128 MB 提交: 95  解决: 11 [提交][状态][讨论版] 题目描述 大学里,最难忘的事情莫过于军训了,白白的HH童鞋就被无情 ...