一、 异常的概念
C#语言的异常处理功能在程序运行期间发生的任何意外或异常情况。异常处理功能使用Try、catch和finally关键字来尝试执行可能失败的操作、在确定合理的情况下处理故障、以及在事后清理资源。
二、异常类
在BCL中定义了很多类,每一个类代表一个指定异常类型。当一个异常发生时,CLR:
1、 创建了该类型的异常对象;
2、 寻找适当的catch 子句来处理它;
.NET Framework 类库中的所有异常都派生于 Exception 类,异常包括系统异常和应用异常。
默认的所有系统异常派生与System.SystemException,所有的应用程序异常派生与System.ApplicationException。
系统异常一般不可预测,比如内存堆栈溢出,空对象引用,权限限制,硬件读取错误等等
应用程序异常一般可以预测,比如文件对象找不到啦,值不在范围内啦,数据类型不一致等 等,设计,处理逻辑可以判断的。
还有一些异常对象含有只读属性,带有导致该异常的信息。这些属性的其中一些如下图
常见的异常类如下图
常见的系统异常如下图:
三、异常处理
在C#中语言中异常与异常处理语句即try….catch ….finally
在上述异常处理的形式中所用到的关键字其含义如下:
Try :用于检查发生的异常,并帮助发送任何可能的异常。
Catch: 以控制权更大的方式处理错误,可以有多个catch子句。
Finally:无论是否发生引发了异常,finally的代码块都将被执行。
1、Try语句
Try语句用来指明为避免出现异常而被保护的代码段,并在发生异常时提供代码处理异常。
Try语句是由三个部分组成:
(1)、try块包含为避免出现的异常而被保护的代码。
(2)、catch子句部分含有一个或者多个catch子句。这些是处理代码异常的代码段,它们称为是异常的处理程序
(3)、finally块含有在所有情况下都要被执行的代码,无论有没有异常的发生。
2、Catch子句
Catch子句处理异常。它有三种形式,允许不同级别的处理。如下图:
3、 Finally块
如果程序的控制流进入了一个带finally块的try语句,那么finally 始终会被执行,如下图:
(1)、如果在try块内部没有异常发生,那么在try块的结尾,控制流跳过任何catch子句并到finally块。
(2)、如果在try块内部发生了异常,那么在catch子句段无论哪一个适当的catch子句被执行,接着就是finally块的执行。
即使try块有return语句或在catch’块中抛出一个异常,finally块也总是会返回到调用代码之前执行,例如下面这个代码一样,在try块的中间有一条return语句,他在某条件下被执行。这不会使他绕过finally语句。