1.在C#中我们如何处理异常?

上面的问题学过C#的问题大家可能都能回答处理,用try-catch-finally具体如下:

            try
{
//可能出错的语句
}
catch (Exception)
{
//有异常的话进行处理
}
finally
{
//有无异常都会从这里进行处理
}

从上面的代码中我们可以知道,我们必须知道哪些语句可能有错误,才能进行预先用try-catch语句进行处理,现在代码量很大了,肯定有我们预期不到的情况,这个时候如果程序有了异常就可能引起程序的崩溃。那我们如何处理这样的异常呢?

理想当然的情况是,用一个try-catch把我们这个程序的代码都包活,可是这只是想想而已……那么具体的怎么实现呢?

2.下面提供一种方案供大家参考

好了,我们直接建立一个winform程序,然后上如下代码:

using System;
using System.Threading;
using System.Windows.Forms; namespace TestAllException
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
//定义线程异常事件
ThreadExceptionHandler handler = new ThreadExceptionHandler();
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.ThreadException += handler.Application_ThreadException;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
internal class ThreadExceptionHandler
{
/// <summary>
/// 实现错误异常事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void Application_ThreadException(object sender,ThreadExceptionEventArgs e)
{
try
{
//如果用户点击Abort按钮则退出应用程序
DialogResult result = ShowThreadExcceptionDialog(e.Exception);
if (result==DialogResult.Abort)
{
Application.Exit();
}
}
catch
{ try
{
MessageBox.Show("严重错误", "严重错误", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally
{ Application.Exit();
}
}
}
/// <summary>
/// 输出错误异常
/// </summary>
/// <param name="ex"></param>
/// <returns></returns>
private DialogResult ShowThreadExcceptionDialog(Exception ex)
{
string errorMessage = "错误信息:\n\n" + ex.Message + "\n\n" + ex.GetType() + "\n\nStack Trace\n\n" + ex.StackTrace;
return MessageBox.Show(errorMessage,"Application Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
} }
}
using System;
using System.Threading;
using System.Windows.Forms; namespace TestAllException
{
//form1下面对应的代码
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
throw new IndexOutOfRangeException("无效的异常操作");
} }
}

通过大家对上面的代码读,我就不直接上界面的图了,form1上只有一个button1的按钮。我们直接运行然后点击按钮,然后就会出现下面的情况:

[caption id="attachment_1225" align="alignnone" width="600"] 全局异常捕捉1[/caption]

这下能够实现我们的需求了,但是是有条件的,仅仅只有主线程一个线程的程序可以这么办,但是当程序的线程增加的时候,新增线程出错的时候我们还是无法捕捉到。具体代码如下:

using System;
using System.Threading;
using System.Windows.Forms; namespace TestAllException
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
throw new IndexOutOfRangeException("无效的异常操作");
} private void button2_Click(object sender, EventArgs e)
{
try
{
Thread th = null;
th = new Thread(new ThreadStart(ThreadStart1));
th.Start();
}
catch (Exception ex)
{
throw ex;
}
} private void ThreadStart1()
{
throw new FormatException("多线程异常,格式异常");
}
}
}

当上面的代码运行时点击button2时我们的异常无法处理,然后程序会崩溃,那么如何处理新增线程的异常呢?这个留到下篇文章开讲。

总结

本文提供了一种可以捕获单线程程序全局异常的方案,供大家参考。希望对大家有帮助。

如何捕获winform程序全局异常?的更多相关文章

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

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

  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. OC基础教程 C语言中的格式占位符:

    C语言中的格式占位符: %a,%A 读入一个浮点值(仅C99有效) %c 读入一个字符 %d 读入十进制整数 %i 读入十进制,八进制,十六进制整数 %o 读入八进制整数 %x,%X 读入十六进制整数 ...

  2. Qt打开外部程序和文件夹需要注意的细节(Qt调用VC写的动态库,VC需要用C的方式输出函数,否则MinGW32编译过程会报错)

    下午写程序中遇到几个小细节,需要在这里记录一下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 QProcess *process = new QProcess(this ...

  3. 关于map

    java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap. Map主要用于存储健值对, ...

  4. Java学习笔记51:数组转ArrayList和ArrayList转数组技巧

    ArrayList转数组: public class Test { public static void main(String[] args) { List<String> list = ...

  5. 【Android】: 部分注意事项

    1.用来触发BroadcastReceive的Intent和启动Activity或Service的Intent是不兼容的. 2.当文件名做为ContentProvider查询的一部分返回的时候,不应该 ...

  6. hdu 4679 (树形DP)

    题意:给一棵树,边的权值都是1,摧毁每条边是有代价的,选择摧毁一条边,把一棵树分成两部分,求出两部分中距离最大的两点的距离,求出距离*代价最小的边,多条的话输出序号最小的. 刚开始理解错题意了,wro ...

  7. Kali Linux 安全渗透教程&lt;第三更&gt;1.2 安全渗透所需工具

    了解了渗透測试的概念后.接下来就要学习进行渗透測试所使用的各种工具.在做渗透測试之前.须要先了解渗透所需的工具.渗透測试所需的工具如表1-1所看到的: 表1-1  渗透所需工具 splint unhi ...

  8. &lt;深入理解C指针&gt;学习笔记和总结 第四章 指针和数组

    数组是一个什么玩意: 数组和指针我的理解,有同样之处也有不同之处.因有同样之处,因此一些资料上说,数组和指针本质是同样的.因有不同之处,因此也有一些资料上说,数组和指针是不一样的. 同样之处: 数组名 ...

  9. 怎样在VirtualBox 虚拟机中挂载共享目录

    啊.好长时间没写博客了.近期有点忙~~ 不得不说 VirtualBox 对于一些不想装非常多个系统又非常想实验新系统的人来说确实是神器: 哈哈.个人还是比較爱玩这些个各种各样的Linux 发型版的,可 ...

  10. java学习——入门扫盲篇

    概要 近期这几天開始进入java的学习,接触到了好多不是非常了解的概念,像JDK.JRE.JVM.GC等等这些,放到这里来进行下扫盲. java java是一种面向对象程序设计语言和java平台的总称 ...