1. 异常的适用情况是
- 异常应该且仅用于异常情况,即异常不能代替正常的条件判断
- 真正出现异常的时候,应该抛出异常,而不是返回特殊值
2. 异常的来源大概是
- 每种异常都应该进行适当的处理
- 用户:用户的输入有问题
- 程序员:编程错误
- 第三方:泛指其他情况,如 I/O 错误、网络、数据库、第三方服务等
3. 异常处理的目标是
- 处理的目标可以分为恢复和报告
- 恢复是指通过程序自动解决问题。报告的最终对象可能是用户,即程序使用者,也可能是系统运维人员或程序员
- 报告的目的也是为了恢复,但这个恢复经常需要人的参与
- 程序都不应该假定第三方是可靠的,应该有容错机制
- 如果是用户:如果用户输入不对,可以提示用户具体哪里输入不对
- 如果是编程错误:可以提示用户系统错误、建议联系客服
- 如果是第三方连接问题:可以提示用户稍后重试
4. 异常处理的一般逻辑是
- 如果自己知道怎么处理异常,就进行处理;如果可以通过程序自动解决,就自动解决;如果异常可以被自己解决,就不需要再向上报告
- 如果自己不能完全解决,就应该向上报告。如果自己有额外信息可以提供,有助于分析和解决问题,就应该提供,可以以原异常为
cause
重新抛出一个异常 - 总有一层代码需要为异常负责。可能是知道如何处理该异常的代码,可能是面对用户的代码,也可能是主程序;如果异常不能自动解决
- 对于用户,应该根据异常信息提供用户能理解和对用户有帮助的信息
- 对运维和开发人员,则应该输出详细的异常链和异常栈到日志
5. 为什么要有异常处理机制
- 在没有异常机制的情况下,唯一的退出机制就是
return
,判断是否异常的方法就是返回值 - 程序的正常逻辑和异常逻辑混杂在一起,代码的可读性和可维护性变差
- 程序员经常偷懒,假装异常不会发生
:joy:
6. 异常处理机制的好处
- 处理异常情况的代码大大减少,代码的可读性、可靠性、可维护性都得到提高,具体表现在
- 程序的正常逻辑与异常逻辑可以相分离
- 异常情况可以集中进行处理
- 异常还可以自动向上传递,不再需要每层方法都进行处理
- 异常也不再可能被自动忽略