异常基础---《clr via c#》笔记
2012-01-30 18:15 海不是蓝 阅读(439) 评论(0) 编辑 收藏 举报
try |
一个try块至少有一个关联的catch或finally块,单独的try块没有意义而且是错误的。
重点:
如果在一个try块执行多个可能抛出同一个异常类型的操作,但是不同的操作有不同的异常恢复措施,就应该将每一个操作都放到它自己的try块中。
catch |
一个try块可以关联0个或多个catch块。注意:如果try块没有关联catch块,那么必须关联一个finally块,否则无法编译通过。
CLR异常的捕捉
clr是自上向下搜索一个匹配的catch块,所以应该把较具体的异常放到顶部,也就是说首先出现的是派生程度最大的异常类型。接着是它们的基类型。如果弄反了这个顺序,那么就会编译错误,因为这样的catch块是不可达的。
try { }
catch (Exception ex) { }
catch (IOException ex) { }
finally { }
上面的代码就会编译失败。错误1上一个 catch 子句已经捕获了此类型或超类型(“System.Exception”)的所有异常
未处理的异常
起因:try块抛出一个异常
过程:clr将搜索捕捉异常类型与抛出异常相同的catch块,如果没有任何捕捉类型与抛出的异常类型匹配,那么clr会去调用栈的更高一层去搜索一个与异常匹配的捕捉类型。
结果:如果clr都调用到了栈的顶部,还是没有找到一个具有匹配捕捉类型的一个catch块,就会发生一个未处理的异常。
抛出异常后finally的执行
try
{
try { }
finally { }
}
catch (IOException ex) { }
finally { }
一旦clr找到一个具有匹配捕捉类型的catch块,就会先执行最内层的finally块中的代码,然后再执行匹配异常的那个catch块相关联的finally块。
finally |
一个try块最多关联一个finally块。
Finally块中的代码应该简短高效,只需要负责对try块中的代码发起的操作进行清理。
世界末日?
如果catch块或finally块中抛出异常,这并不是世界末日!这样的异常不会由我们的代码来处理,最终会变成一个未处理的异常,然后clr会终止你的进程。