总结一下看到的Java异常处理的注意点的内容
1) Checked Exception和UncheckedException的选择
这一点其实仁者见仁智者见智。
Checked Exceptions 应该定义为:可以被预料到,却无法避免,但是可以进行适当处理的异常。
Unchecked Exceptions 则是Checked Exceptions以外的异常
- 可以被预料到,却无法避免: 可以尽一切可能去验证输入内容,但是一些控制之外的状况会引起操作失败。比如尝试读取文件时,有人在你检查文件是存在之后,读取文件之前的时间段内删除了文件。通过定义一个Checked Exceptions使方法调用者可以预期到这个错误。
- 可以进行适当处理: 这个预期错误并不是无法恢复。例如:当用户尝试读取一个不存在的文件时,可以提示他提供一个新的文件名。另一方面,如果是由于bug造成的问题,程序无法修复。最好的办法是在异常处理中输出Log,等待开发者稍后处理。
2)在每一级重新评估:
有时候,捕获异常的方法并不是处理异常的正确地方。在这种情况下,考虑一下对于自己的调用者,怎样的处理才是合适的。如果对于调用者,这个异常是可预期、不可预防、但是可以进行适当处理的,你应当抛出一个checked exception 。否则,你应当将异常包装为unchecked exception。
对于checked 和 unchecked exceptions,使用正确的抽象级别. 例如, 一个仓库类有两个不同的实现 (database 和 filesystem) 应当避免抛出SQLException
or IOException
暴露具体的实现细节。 作为替代, 应该把例外包装在一个抽象的概念中,涵盖所有的实现 ( RepositoryException
).
3)catch不同级别的exception
抛出多个异常时,需要catch不同级别的exception,以便进行针对性处理。多个catch代码块中捕获的exception范围必须从小到大,最后是Exception类。4)有效利用finally代码块
异常处理之后,要在finally代码块中保证db链接关闭,读写流关闭,锁释放等操作。避免内存泄露等状况。
持续学习中,若有补充,随时更新。。