1.如何处理异常?
方法B抛出了一个受检的异常 ,那么方法A在内部调用方法B时,面对方法B抛出的受检异常,可以选择继续抛出向上传播这个异常,也可以捕获这个异常进行处理。究竟是向上传播抛出,还是捕获处理呢?
2.处理异常方法
方法一:抛出与抽象想对应的异常。
例如
如果方法B抛出了NoSuchElementException这个受检异常,然而在方法A中调用方法B时,根据方法A中的逻辑,当遇到NoSuchElementException异常时,抛出一个IndexsOutOfBoundsException异常更为合适。那么就不应该选择向上传播抛出NoSuchElementException,而是应该选择捕获NoSuchElementException,然后抛出IndexsOutOfBoundsException。
更高层的实现应该捕获底层的异常,同时抛出可以按照高层抽象进行解释的异常。这种做法称为异常转译(exception translation)。
方法二:避免底层异常出现。
处理来自底层异常的最好做法是,在调用底层方法之前确保它们会成功执行。
还是拿上面的当成例子,如果高层的A方法能够通过普通的判断语句保证底层的B方法永远也不会抛出异常,那么就可以不必处理B方法的异常。
方法三:绕开底层异常。
如果无法避免低层异常,可以让更高层来悄悄地绕开这些异常,从而将高层方法的调用者与低层的问题隔离开来。使用适当地记录机制来将异常记录下来。
对于上面的例子,如果A方法实在不能避开B方法,那么该怎么办呢,只需要try-catch底层的异常,然后偷偷地通过记录机制把异常记录下来,这样A就不用做其他异常处理了。