如果一个方法抛出的异常与它所执行的任务没有明显关联关系的话,会使人感到不知所措。为了避免这个问题,应该在高层的实现中俘获底层抛出的“低级”异常,并同时用另一“高级”异常继续向外抛。
例如,如我们在方法中,有一段循环,一个一个地取集合的一下元素。当catch到一个 NoSuchElementException 或 NullPointerException 时,说明已经到头儿了。这时我们可以 new 一个 IndexOutOfBoundsException 并向上抛出。对于此方法的调用者来说,这个异常显然比前两个更有实际意义。这被称为异常转译。
但是,尽管异常转译比不加选择地传递低层异常的做法有所改进,但是这也不能被滥用。
当然,“高层”的异常也可以是你的自造异常。如一个和文件相关的操作,如果你的设计并不在意文件操作是因何而失败的话。那么你大可以将 FileNotFoundException 和 IOException 等 可能出现的“低层”异常都转化为你自己的 FileOperationException。当然,这还有一个前提,就是对照上一条先判断一下这里出现一个你自己自造的异常是否合适,还是就该使用那些标准的“低层”异常。
【Effective Java 学习笔记】系列连载专题请见:
http://tonylian.iteye.com/categories/64208