优势2:向调用堆栈上层传递错误
异常处理的第二个优势是向方法的调用堆栈上层传递错误报告的能力。假如readFile方法是主程序调用的一系列嵌套方法中的第四个方法:方法1调用方法2,方法2调用方法3,方法3调用readFile,代码结构如下所示:
method1 { call method2; } method2 { call method3; } method3 { call readFile; }
还假如method1是唯一的能够处理readFile方法中所可能发生的错误的方法,那么传统的错误处理技术会强制method2和method3来传递通过readFile调用堆栈所返回的错误代码,直到错误代码传递到method1-因为只有method1能够处理这些错误,其代码结构如下所示:
method1 { errorCodeType error; error = call method2; if (error)
doErrorProcessing; else proceed; } errorCodeType method2 { errorCodeType error; error = call method3; if (error)
return error; else proceed; } errorCodeType method3 { errorCodeType error; error = call readFile; if (error)
return error; else proceed; }
回忆一下,Java运行时环境搜寻调用堆栈来查找任意的处理特殊的异常的方法。一个方法能够抛出它内部的任何异常,所以允许一个上层调用堆栈的方法来捕获它。因此只有处理相关错误的方法来处理发现的错误,代码结构如下所示:
method1 { try { call method2; } catch (exception e) { doErrorProcessing; } } method2 throws exception { call method3; } method3 throws exception { call readFile; }
无论怎样,就像伪代码所展示的那样,躲避异常需要中间方法做一些工作。任意被检查到的由内部方法的抛出的异常必须在这个方法的throws子句中被指定。
|