如果方法抛出的异常和外层执行任务没有明显的联系,会使人很困惑
- 更高层实现应该捕获底层异常,并且抛出按照高层逻辑进行解释的异常
如果底层的异常对于调试有帮助,可以考虑使用异常链
- 高级异常的构造需要低级异常作为参数传入
- 大部分标准异常都支持链的构造器
- 对于不支持的,可以使用Throwable initCause来实现
- getCause 获取原因
- 还可以使用堆栈轨迹,集成到更高级的异常
尽管异常转译比不加思索的抛出底层异常有所改进,但是也请不要滥用
- 在调用底层异常时,多做些检查,确保其执行正常,从而避免抛出异常
如果无法避免底层异常,次选方案是让高层绕过,使用某种适当的记录机制将异常记录下来
总而言之::异常转译和异常链都不错
- 异常转译使得异常语义更加明确
- 异常链,允许逐层进行分析