C#异常处理及心得

C sharp中的异经常使用于处理系统级和应用程序级的错误状态,它是一种结构化、统一的类型安全的处理机制。c#的异常 机制很是相似于c++的异常处理机制,可是仍是有一些重要的区别:c++

1,在 C# 中,全部的异常必须由从 System.Exception 派生的类类型的实例来表示。在 C++ 中,可使用任何类型的任何值表示异常。c#

2,在 C# 中,利用 finally 可编写在正常执行和异常状况下都将执行的终止代码。在 C++ 中,很难在不重复代码的状况下编写这样的代码。数组

3,C# 中,系统级的异常如溢出、被零除和 null 等都对应地定义了与其匹配的异常类,而且与应用程序级的错误状态处于同等地位。
安全

1.1 致使异常的缘由ide

能够以两种不一样的方式引起异常。函数

· throw 语句(第 ‎8.9.5 节)用于当即无条件地引起异常。控制永远不会到达紧跟在 throw 后面的语句。spa

· 在执行 C# 语句和表达式的过程当中,有时会出现一些例外状况,使某些操做没法正常完成,此时就会引起一个异常。例如,在整数除法运算(第 ‎7.8.2 节)中,若是分母为零,则会引起 System.DivideByZeroException。有关可能以此方式引起的各类异常的列表,请参见第 ‎16.4 节。线程

1.2 System.Exception code

System.Exception 类是全部异常的基类型。此类具备一些全部异常共享的值得注意的属性:对象

· Message 是 string 类型的一个只读属性,它包含关于所发生异常的缘由的描述(易于人工阅读)。

· InnerException 是 Exception 类型的一个只读属性。若是它的值不是 null,则它所引用的是致使了当前异常的那个异常,即表示当前异常是在处理那个 InnerException 的 catch 块中被引起的。不然,它的值为 null,则表示该异常不是由另外一个异常引起的。以这种方式连接在一块儿的异常对象的数目能够是任意的。

这些属性的值能够在调用 System.Exception 的实例构造函数时指定。

1.3 异常的处理方式

发生异常时,系统将搜索能够处理该异常的最近的 catch 子句(根据该异常的运行时类型来肯定)。首先,搜索当前的方法以查找一个词法上包含着它的 try 语句,并按顺序考察与该 try 语句相关联的各个 catch 子句。若是上述操做失败,则在调用了当前方法的方法中,搜索在词法上包含着当前方法调用代码位置的 try 语句。此搜索将一直进行下去,直到找到能够处理当前异常的 catch 子句(该子句指定一个异常类,它与当前引起该异常的运行时类型属于同一个类或是该运行时类型所属类的一个基类)。注意,没有指定异常类的 catch 子句能够处理任何异常。

找到匹配的 catch 子句后,系统将把控制转移到该 catch 子句的第一条语句。在 catch 子句的执行开始前,系统将首先按顺序执行嵌套在捕捉到该异常的 try 语句里面的全部 try 语句所对应的所有 finally 子句。

若是没有找到匹配的 catch 子句,则发生下列两种状况之一:

· 若是对匹配的 catch 子句的搜索到达一个静态构造函数(第 ‎10.12 节)或静态字段初始值设定项,则在致使调用该静态构造函数的代码位置引起 System.TypeInitializationException。该 System.TypeInitializationException 的内部异常将包含最初引起的异常。

· 若是对匹配的 catch 子句的搜索到达最初启动当前线程的代码处,则该线程的执行就会终止。此类终止会产生什么影响,应由实现来定义。

特别值得注意的是在析构函数执行过程当中发生的异常。若是在析构函数执行过程当中发生异常且该异常未被捕获,则将终止该析构函数的执行,并调用它的基类的析构函数(若是有)。若是没有基类(如 object 类型中的状况),或者若是没有基类析构函数,则该异常将被忽略。

1.1 公共异常类
下列异常由某些 C# 操做引起。

1 System.ArrayTypeMismatchException

当存储一个数组时,若是因为被存储的元素的实际类型与数组的实际类型不兼容而致使存储失败,就会引起此异常。

1 System.DivideByZeroException

在试图用零除整数值时引起。

1 System.IndexOutOfRangeException

在试图使用小于零或超出数组界限的下标索引数组时引起。

1 System.InvalidCastException

当从基类型或接口到派生类型的显式转换在运行时失败时,就会引起此异常。

1 System.NullReferenceException

在须要使用引用对象的场合,若是使用 null 引用,就会引起此异常。

1 System.OutOfMemoryException

在分配内存(经过 new)的尝试失败时引起。

1 System.OverflowException

在 checked 上下文中的算术运算溢出时引起。

1 System.StackOverflowException

当执行堆栈因为保存了太多挂起的方法调用而耗尽时,就会引起此异常;这一般代表存在很是深或无限的递归。

1 System.TypeInitializationException

在静态构造函数引起异常而且没有能够捕捉到它的 catch 子句时引起。

okay上文的内容就是对c#语言规范中对于异常处理的总结,下面总结一下咱们这些新手常常出现的问题,请高手们补充,谢谢!
1、是否缺乏 using 指令或程序集引用?
这是我在最近的探索中常常遇到的问题,虽然已经添加引用了,可是总会提示,很折磨的说,我总结了两种较为一般的处理:
 
一、修改:右击类文件--属性--生成操做--将“内容”改成“编译”,而后从新生成,问题解决。
 二、另外一种状况:项目中存在多个类库,生成项目时提示 未能找到类型或命名空间名称“XXXX”(是否缺乏 using 指令或程序集引用?)  ,找到相应类库中的“引用”文件夹,在其中添加对应的dll文件,单独生成此类库,若仍是提示,则须要查看“引用”中是否有引用其余类库所生成的dll文件,若是存在,则须要先确保生成该dll文件的类库能够正常生成,以此类推,最终生成整个项目。
2、try,catch,finally
我是这样理解的,先执行try里面的语句,若是try里面的语句抛出了错误,就会被catch捕获,因此就会中断try里面语句的执行转而执行catch里面的语句,若是try里面的语句都执行完了也没有抛出错误,那么catch里的语句就没有机会执行了。最后不论try顺利运行完毕,仍是try抛出了错误被catch语句捕获并执行了catch的语句都要接着执行finally里面的语句。可是总感受缺点什么~

 

这里给出一个msdn上的最佳异常处理方法,但愿会有所帮助。

http://msdn.microsoft.com/zh-cn/library/seyhszts.aspx

相关文章
相关标签/搜索