java 程序设计语言可抛出三种结构(throwable):
- 受检异常
- 运行时异常
- 错误
虽然什么时候抛出什么,不总是那么的清晰,但是依然存在一些指导性原则
- 如果可以适当的恢复,请使用受检异常(强迫调用者处理该异常或者抛出去)
- API 设计者让api 用户面对受检异常,强迫处理受检异常
未受检的抛出结构包括(运行时异常、错误)
- 二者都是不需要也不应该被捕获的可抛出结构
- 如果抛出为受检异常,往往就属于不可恢复的情形,继续执行下去有害无益
使用运行时异常表明变成错误
- 大多数运行时异常都是前提违例导致的
- 前提违例:调用者未遵守api的调用规范
虽然 java 语言规范没要求,但是错误往往被jvm保留用来表示资源不足、约束失败、或其他是程序无法执行下去的条件
- 约定俗成,最好不要再去创建Error 的子类
- 所有未受检抛出结构都应该是RuntimeException 的子类
- 可以定义一个新的抛出结构(不属于上述三者),这样做没有任何益处,而且困扰api使用者
总之:
- 可恢复异常,使用受检异常
- 程序错误,使用运行时异常
- 如果不清楚是否可恢复,最好使用未受检异常
- 受检异常往往指明了恢复条件,提供辅助方法就很重要(比如电话呼叫失败,捕获异常可以查询欠费金额并且返回给用户看)