异常(Exception)就是程序执行期间发生的问题。无论编程技术有多好,程序都难免
出现异常情况。
如输入了非法数据,要读取的文件不存在等等。
C#提供了一套完美的方案,在程序主线之外处理异常,不但使程序更加健壮、更加容错,而且保持了程序结构的清晰。
一般情况下我们需要对异常情况进行处理,这时就需要捕获并处理异常。在 C#中用try-catch 结构捕获并处理异常。
格式:
try{
可能出现异常的语句;
}
catch(异常类 异常类对象){
异常发生后的处理代码;
}
……
finally{
不论是否出现异常,都要执行的语句;
}
说明:
1.try 块后面至少要有一个 catch 块或者finally 块,finally 块必须放在最后。
2.有多个 catch 块时,要按从具体到一般的顺序由上往下排列,基类必须放在最后,否则捕捉派生类异常的 catch 块永远没机会被执行。
3.catch块后面的参数可以只有类没有对象;还可以不给 catch 块指定异常类型,这时它可以捕获任何异常。
.NET 可以自动检测并抛出常见异常,但有时需要人工抛出异常。
系统引发异常:在执行C#语句和表达式的过程中,有时会出现一些例外情况,使某些操作无法正常完成,此时就会引发一个异常。对程序来说,这种异常是被动地发生的。
主动引发异常:使用throw语句来立即、无条件地引发异常。控制永远不会到达紧跟在throw后面的语句。对程序来说,主动地检查到了错误或者意外事件,因此引发了一个异常来通知用户或者调用代码。
throw new XXXException();
异常类Exception中比较重要的两个属性是 Message 和 StackTrace。属性 Message 用于描述异常的原因,属性 StackTrace 用于描述异常的堆栈信息,即发生异常的位置。
Exception | SystemException | ArgumentException 处理参数无效的异常 | ArgumentNullException |
ArgumentOutOfRangeException | |||
FormatException | 处理参数格式错误的异常 | ||
MemberAccessException 处理访问类的成员失败时所引发的异常 | FieldAccessException 访问字段成员失败 | ||
MethodAccessException 访问方法成员失败 | |||
MissingMemberException 成员不存在 | |||
IndexOutOfRangeException | 下标超出了数组长度 | ||
ArrayTypeMismatchException | 数组中存储数据类型不正确的元素所引发的异常 | ||
RankException | 数组维数错误 | ||
IOException 处理进行文件输入输出操作时所引发的异常
这个类在System.IO命名空间中 | DirectoryNotFoundException | ||
FileNotFoundException | |||
FileLoadException 无法加载文件 | |||
PathTooLongException | |||
EndOfStreamException 已经到达流的末尾而还要继续读数据 | |||
ArithmeticException 算术运算相关异常类 | DivideByZeroException | ||
OverflowException | |||
ApplicationException | 该类表示应用程序发生非致命错误时所引发的异常(建议:应用程序自身引发的异常通常用此类) |
创建自己的异常时,用户定义的异常类的名称通常需要以“Exception”结尾,一般从ApplicationException类派生,并实现三个常见的构造函数。