代码改变世界

异常基础---《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会终止你的进程。