C# catch exception捕捉异常大全

异常机制无论java还是.net都是非常重要的一部分,那么该怎样使用它来捕捉异常信息呢?

什么是异常:异常是程序在执行是发生的错误。
导致异常的原因:
    一、代码错误,包括语法错误、逻辑错误
    二、资源不可用,这是由系统访问了未经授权的资源而引起的错误。
    三、公共语言运行库,这是有CLR内部引起的错误。
Exception类
Exception为我们提供了大量的捕获、处理异常的方法。Exception类中封装的异常处理有两种
1、由用户程序执行引发的异常,派生于ApplicationException类。
2、另一种是有公共语言运行库引发的异常,派生于SystemException类。

.net异常处理.png

异常类型一览

常见的异常类型:
SystemException:
提供系统异常和应用程序异常之间的区别。
ArgumentException:当方法提供的任意一个参数无效时,引发此异常。
ArithmeticException:此异常表示由于算术运算导致的错误。
DataException:如果在使用ADO.NET组件时生成错误,引发此异常。
FormatException:当参数的格式不符合被调用方法的参数规范时,引发此异常。
IOException:当出现I/O错误是,引发此异常。
IndexOutOfRangeException:当试图使用数组边界外的索引来访问数组的元素时,引发此异常。
ArgumentNullException:在将空引用传递给无效参数的方法时,引发此异常。
OverflowException:当算数运算的结果大而无法由目标类型表示时,引发此异常。
DivideByZeroException:当试图用某个数除以零时,引发此异常。
ApplicationException:在应用程序执行过程中检测到有应用程序定义的异常。
TargetException:当试图调用无效目标时,引发此异常。
ArrayIndexOutOfBoundsException:数组小于或大于实际的数组大小。
NullPointerException:尝试访问Null对象成员。
ClassNotFoundException:不能加载所需的类。
InputMismatchException:欲得到的数据类型与实际输入数据类型不匹配。
IllegalArgumentException:方法接受到非法参数。

异常类常用属性:
Message:
提供引发异常的详细信息。
Source:此属性表示导致异常发生的应用程序或对象的名称。(异常源)
StackTrace:此属性提供在堆栈上所调用方法的详细信息,并首先显示最近调用的方法。
InnerException:对内部异常的引用,如果此异常基于前一个异常,则内部异常指最初发生的异常。

 

抛出异常的时机:

在设计一个函数的时候,应该使用代码尽可能的避免已知的异常,比如:空值,除零等。但是如果遇到了未知异常并且使用函数的返回值不足以表达遇到的异常的时候,应该抛出这个异常,有必要的时候应该设计自己的异常类,使用InnerException表达遇到的未知异常。

追记,由于函数都有可能抛出异常,所以,在添加函数注释的时候,应该使用<exception cref="Exception"></exception>来标记。使用函数的时候,查看注释可以看到该标记,来避免已知异常。

怎样正确处理异常?

理未常:

确保所有的程序入口都使用了try-catch。

在catch中截获所有的异常,并进行处理。对异常进行处理的方式有:

1.记录异常

在文件中记录异常

在数据库中记录异常

在Eventlog中记录异常

2.发送E-mail来通知异常

3.异常产生时候,用友好(user-friendly)的方式通知用户 

捕获UI线程中的未处理异常:添加一个全局异常理函

我们虽然没有在所有的应用程序入口写捕获异常的try-catch块,但是使用Application对象中的ThreadException属性可以设置一个delegate来捕获所有未处理的Main UI线程中出现的异常。这种方式只能处理主线程当中的异常,其他工作线程、辅助线程在异常时捕获不到的。 

捕获工作线程(Worker Threads)中的未处理异常

编写多线程代码时,必须考虑在工作线程中出现的异常。在线程的入口使用try-catch捕获工作线程中产生的未处理异常,然后,在Catch中使用delegate或其他的方式将发生的异常通知给主线程。

Private void ThreadProcessCB()

{

           Try

{

}

Catch(exception ee)

{

          This.BeginInvoke(new WorkerThreadExceptionHandlerDelegate(WorkerThreadExceptionHandler), new  object[]{ee});

}

异常理的最好方

不要:

Catch异常并re-throw,因为重新抛出一个新的异常,会损失一些消息,例如会损失这个异常中带有的一些调用堆栈的信息。

通过抛出异常来控制代码的执行。

在程序的构造函数入口处添加try-catch方法/属性/构造。

MessageBox.Show(MyException.ToString())。

使用了try-catch但是并没有处理异常,这样就隐藏了该异常,不利于发现问题,可能使程序进入未知的处理分支。 

需要:

从始至终要紧记异常处理的策略。

抛出具体的一个异常,而不是只抛出Exception类型的异常。这样能方面我们捕获对应类型的异常。

在应用程序所有的入口处使用try-catch:事件处理函数,主函数,线程入口。

在代码中处理所有意料到的异常。

编写代码时要注意考虑到应用程序最差的情况。

显示有好的信息,并提供适当的管理员联系信息

在可能的情况下提供可能的选择(终止,重试,忽略) 

异常理程序

Publisher/subscriber设计模式

下载异常处理程序块

http://www.microsoft.com/downloads/details.aspx?FamilyID=8ca8eb6e-6f4a-43df-adeb-8f22ca173e02&DisplayLang=en

编译工程

在新的工程中添加引用

引入名称空间Microsoft.ApplicationBlock.ExceptionManagement

使用ExceptionManager.Publish()来发布异常

配置app.config文件启用异常管理,使其出现异常的时候在系统日志中添加一条记录。

在.config文件中配置一些信息可以添加自己的异常处理模块

以上就是异常处理的全部内容了,感谢大家的阅读!

原文来自:技术之家

转载于:https://my.oschina.net/u/3510534/blog/911170

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值