前言

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

处理多线程程序的全局异常demo

好了下面直接上代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Windows.Forms;
  5. using System.Threading;
  6.  
  7. namespace WindowsFormsApplication2
  8. {
  9. static class Program
  10. {
  11. /// <summary>
  12. /// 应用程序的主入口点。
  13. /// </summary>
  14. [STAThread]
  15. static void Main()
  16. {
  17. ThreadExceptionHandler handler = new ThreadExceptionHandler();
  18. // 设置没有没捕获的异常在这里强制被捕获
  19. Application.SetUnhandledExceptionMode(UnhandledExceptionMode.Automatic);
  20. // 注册UI线程异常事件
  21. Application.ThreadException += handler.Form1_UIThreadException;
  22. // 注册非UI线程异常事件
  23. AppDomain.CurrentDomain.UnhandledException += handler.CurrentDomain_UnhandledException;
  24. Application.EnableVisualStyles();
  25. Application.SetCompatibleTextRenderingDefault(false);
  26. Application.Run(new Form1());
  27. }
  28. }
  29.  
  30. internal class ThreadExceptionHandler
  31. {
  32. /// <summary>
  33. /// 捕获UI线程的异常
  34. /// </summary>
  35. /// <param name="sender"></param>
  36. /// <param name="t"></param>
  37. public void Form1_UIThreadException(object sender, ThreadExceptionEventArgs t)
  38. {
  39. DialogResult result = DialogResult.Cancel;
  40. try
  41. {
  42. result = ShowThreadExceptionDialog("Windows Forms UI错误", t.Exception);
  43. }
  44. catch
  45. {
  46. try
  47. {
  48. MessageBox.Show("严重的错误","Windows Forms UI错误", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
  49. }
  50. finally
  51. {
  52. Application.Exit();
  53. }
  54. }
  55.  
  56. // 点中止时退出程序
  57. if (result == DialogResult.Abort)
  58. Application.Exit();
  59. }
  60.  
  61. /// <summary>
  62. /// 捕获非UI线程的异常,
  63. /// </summary>
  64. /// <param name="sender"></param>
  65. /// <param name="e"></param>
  66. public void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
  67. {
  68. DialogResult result = DialogResult.Cancel;
  69. try
  70. {
  71. Exception ex = (Exception)e.ExceptionObject;
  72. result = ShowThreadExceptionDialog("非UI线程错误", ex);
  73. }
  74. catch (Exception exc)
  75. {
  76. try
  77. {
  78. MessageBox.Show("严重的非UI线程错误:" + exc.Message, "非UI线程错误", MessageBoxButtons.OK, MessageBoxIcon.Stop);
  79. }
  80. finally
  81. {
  82. Application.Exit();
  83. }
  84. }
  85. // 点中止时退出程序
  86. if (result == DialogResult.Abort)
  87. Application.Exit();
  88. }
  89.  
  90. /// <summary>
  91. /// 创建错误信息并显示
  92. /// </summary>
  93. /// <param name="title"></param>
  94. /// <param name="e"></param>
  95. /// <returns></returns>
  96. private DialogResult ShowThreadExceptionDialog(string title, Exception e)
  97. {
  98. string errorMsg = "应用程序错误,请联系管理员," + "错误信息:\n\n";
  99. errorMsg = errorMsg + e.Message + "\n\nStack Trace:\n" + e.StackTrace;
  100. // 在这边记下日志,一般情况下我们可以自定义日志 TODO
  101. return MessageBox.Show(errorMsg, title, MessageBoxButtons.AbortRetryIgnore,MessageBoxIcon.Stop);
  102. }
  103. }
  104. }
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Reflection;
  10. using System.Threading;
  11.  
  12. namespace WindowsFormsApplication2
  13. {
  14. public partial class Form1 : Form
  15. {
  16. public Form1()
  17. {
  18. InitializeComponent();
  19. }
  20.  
  21. private void button1_Click(object sender, System.EventArgs e)
  22. {
  23. throw new IndexOutOfRangeException("无效的异常操作");
  24. }
  25.  
  26. private void button2_Click(object sender, System.EventArgs e)
  27. {
  28. Thread th = new Thread(new ThreadStart(ThreadStart1));
  29. th.Start();
  30. }
  31. private void ThreadStart1()
  32. {
  33. throw new FormatException("多线程异常,格式异常");
  34. }
  35. }
  36. }

来自于:http://vsdot.net/archives/1228.htm

转:如何捕获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. 8-GPIO复用

    8-GPIO引脚复用与重映射 0.通用GPIO 在复位期间及复位刚刚完成后,复用功能尚未激活,I/O 端口被配置为输入浮空模式. 复位后,调试引脚处于复用功能上拉/下拉状态: ● PA15:JTDI ...

  2. FlashFXP+FileZillaServer

    从远程站点里拷贝文件到本地时,如果文件太大,通常会非常耗时,再加上若需要拨VPN,网络上的任何波动都会造成传输文件失败从头来过. 运用FlashFXP和FileZillaServer这两个工具,它拥有 ...

  3. windows(64位)下使用curl安装

    windows(64位)下使用curl安装 转自:https://blog.csdn.net/wkj001/article/details/54889907 2017年02月06日 09:46:47  ...

  4. 20165236 第六周Java学习总结

    20165236 第六周Java学习总结 一. 第八章内容: 1.String 类: String对象.常量对象:字符串并置: 常用方法: length,equals,startsWith,compa ...

  5. react 首页加载loading

    首页加载loading,放在#root里面,代码如下: <!DOCTYPE html> <html lang="en"> <head> < ...

  6. [django]modelform实现的多文件上传

    实现效果 代码 models.py from django.db import models import uuid class UUIDTools(object): ""&quo ...

  7. docker知识点

    1  安装 http://www.runoob.com/docker/centos-docker-install.html 2  dockerhub官网找到 emqttd 执行 docker pull ...

  8. OpenShift nfs 持久化

    创建PV { "apiVersion": "v1", "kind": "PersistentVolume", " ...

  9. conda常用命令

    1. conda基本命令 检查Anaconda是否成功安装 conda --version 检测目前安装了哪些环境 conda info --envs 检查目前有哪些版本的python可以安装: co ...

  10. ROC曲线,AUC面积

    AUC(Area under Curve):Roc曲线下的面积,介于0.1和1之间.Auc作为数值可以直观的评价分类器的好坏,值越大越好. 首先AUC值是一个概率值,当你随机挑选一个正样本以及负样本, ...