i.Posei's blog

Happiness only real when shared!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

基础 - 异常处理

Posted on 2006-03-24 13:10  i.Posei  阅读(471)  评论(0编辑  收藏  举报

     异常处理

     为了处理可能的错误情况,一般把程序分成三种不同类型的代码块:
     try 块包含的代码组成了程序的正常操作部分,但可能遇到错误的情况
     catch 块中的代码处理各种错误情况
     finally 块包含的代码清理资源或执行要在try块末尾执行的其他操作
     在语法上catch和finally块在try的后面,当执行catch和finally块的时候,try块中的定义的变量也就出了作用域。一个try-catch-finally代码块中,try块和finally块只能有一个,而catch块可以有多个。
     在遇到一个异常的时候,计算机将会在依顺序在catch块中查找能处理当前异常的程序块,然后执行之,然后忽略其他的catch块。

     嵌套的异常处理

     有下边代码:

try
{
 
// point A
 try
 {
  
// point B
 }
 
catch
 {
  
// point C
 }
 
finally
 {
  
// clear up
 }
 
// point D
}
catch
{
 
}
finally
{

}

     在上边的代码中,如果标记为A和D的地方抛出了异常,由于这个地方位于内层try块外,所以如果外层的catch块包含了一个合适的异常处理程序,那么这就和没嵌套try的情况一样了。
     如果异常是在B处抛出,由于当前位置是在内层try块中,所以.Net运行时会在内层的catch块中查找一个合适的处理程序,如果找到了这样的处理程序,就执行它,并像往常一样执行内层的finally块,外层的try块根本不会进入程序流,就好像程序中只有一个try块一样。
     如果异常是在代码块B中抛出,但是内层的catch块中没有合适的处理程序存在,那么.Net运行时只能退出内层try块,才能搜索到处理程序。因为退出了内层try块,所有内层finally块的代码会正常执行,但是D处的代码不会被执行,因为内层finally块的代码执行完后,系统会继续为异常搜索处理程序,下一个要搜索的区域显然是在外层的catch块。如果系统在这里找到一个合适的处理程序,就会执行改处理程序,再执行外层的finally块,如果没有找到合适的处理程序,就会继续搜索。在这个例子中,执行的是外层的finally块,因为没有更多的catch块,所以控制权会返回.Net运行时,中断程序的执行,显示通常的对话框,显示出现一个未处理的异常。
     如果异常是在C处抛出,就必须先处理由B抛出的异常,然后的异常处理就跟它是在外层try块中抛出的是一样的,程序流会立即退出内层的catch块,执行内层的finally块,在外层的catch中搜索处理程序。同样,如果内层的finally块中抛出了一个异常,程序会在外层的catch块开始搜索合适的处理程序。
     无论嵌套多少个try块,规则是一样的。在每个块中,.Net运行时顺序执行try块,查找合适的处理程序,在每个步骤中,但退出catch块后,就会执行对应finally块中的代码,但不执行finally块外部的代码,知道找到合适的catch处理程序,并执行为止。