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