12.1、异常的嵌套
try……catch……是可以嵌套的,如果内层try出现异常,内层的catch就会捕获这个异常,然后处理,处理完成之后,在外层的try中就认为内层的都是正常的,外层不会出现异常;但是如果在内层try中出现异常之后,如果在catch中用throw抛出了异常,那么内层的执行就从throw开始终止了,哪怕内层还有很多没执行,哪怕内层还有循环,也直接跳到外层的catch中了,外层就会捕获到内层抛出的异常了。
12.2、多个catch处理不同的异常
一段程序在运行的时候,由于不同的原因,是可以出现各种不同的异常的,通常希望针对每种不同的异常做不同的处理。那么就需要有多个catch,try……catch……是可以有多个catch的,每个catch后面都可以定义一个特定的异常,当try出现异常的时候,会将异常与catch中定义的异常做对比,如果能比对上,那么就执行catch中的语句。这样就能处理特定异常了。每次的try出现异常之后,只会执行一个catch,不会执行多个。所以每次只能有一个catch是满足某个异常的(Exception除外)。
Exception是所有异常的父类,不论哪一种异常,都能与Exception比对上。所以,Exception不能放在所有的异常catch之前,除非只有Exception一个catch。
try
{
int i = 1;
while (true)
{
i++;
if (i > 5) break;
Console.WriteLine("Thread {0} started", Thread.CurrentThread.Name);
Thread.Sleep(2000);
Console.WriteLine("Thread {0} completed", Thread.CurrentThread.Name);
}
}
catch (ThreadAbortException e)
{
Console.WriteLine("Thread Exception");
}
catch (IndexOutOfRangeException e)
{
Console.WriteLine("Thread Exception");
}
catch (Exception e)
{
Console.WriteLine("Thread Exception");
}
12.3、常用的异常类型
Exception | 所有异常对象的基类。 |
SystemException | 运行时产生的所有错误的基类。 |
IndexOutOfRangeException | 当一个数组的下标超出范围时运行时引发。 |
NullReferenceException | 当一个空对象被引用时运行时引发。 |
InvalidOperationException | 当对方法的调用对对象的当前状态无效时,由某些方法引发。 |
ArgumentException | 所有参数异常的基类。 |
ArgumentNullException | 在参数为空(不允许)的情况下,由方法引发。 |
ArgumentOutOfRangeException | 当参数不在一个给定范围之内时,由方法引发。 |
InteropException | 目标在或发生在CLR外面环境中的异常的基类。 |
ComException | 包含COM类的HRESULT信息的异常。 |
SEHException | 封装Win32结构异常处理信息的异常。 |
SqlException | 封装了SQL操作异常。 |
SystemException | 其他用户可处理的异常的基本类 |
ArgumentException | 方法的参数是非法的 |
ArgumentNullException | 一个空参数传递给方法,该方法不能接受该参数 |
ArgumentOutOfRangeException | 参数值超出范围 |
ArithmeticException | 出现算术上溢或者下溢 |
ArrayTypeMismatchException | 试图在数组中存储错误类型的对象 |
BadImageFormatException | 图形的格式错误 |
DivideByZeroException | 除零异常 |
DllNotFoundException | 找不到引用的DLL |
FormatException | 参数格式错误 |
IndexOutOfRangeException | 数组索引超出范围 |
InvalidCastException | 使用无效的类 |
InvalidOperationException | 方法的调用时间错误 |
MethodAccessException | 试图访问思友或者受保护的方法 |
MissingMemberException | 访问一个无效版本的DLL |
NotFiniteNumberException | 对象不是一个有效的成员 |
NotSupportedException | 调用的方法在类中没有实现 |
NullReferenceException | 试图使用一个未分配的引用 |
OutOfMemoryException | 内存空间不够 |
PlatformNotSupportedException | 平台不支持某个特定属性时抛出该错误 |
StackOverflowException | 堆栈溢出 |
2009-03-27