异常处理机制主要回答了三个问题
What:异常类型回答了什么被抛出
where:异常堆栈跟踪回答了在哪抛出;
why:异常信息回答了为什么被抛出;
Error和Exception的区别
从概念角度解析Java的异常处理
Error:程序无法处理的系统错误,编译器不做检查;
Exception:程序可以处理的异常,捕获后可能恢复;
总结:前者是程序无法处理的错误,后者是可以处理的异常。
Exception分类
runtimeException:不可预知的,程序应当自行避免;
非RuntimeException:可预知的,从编译器校验的异常;
从责任角度看
- error属于JVM需要承担的责任;
- RuntimeException是程序应该承担的责任;
- checked exception可检查异常时java编译器应该承担的责任;
异常处理机制
- 抛出异常:创建异常对象,交由运行时系统处理
- 捕获异常:寻找合适的异常处理器处理异常,否则终止运行
异常的处理原则
- 具体明确:抛出的异常应能通过异常类名和message准确说明异常的类型和产生异常的原因;
- 提早抛出:应尽可能早的发现并抛出异常,便于精准定位问题;
- 延迟捕获:异常的捕获和处理应尽可能延迟,让掌握更多信息的作用域来处理异常
高效主流的异常处理框架
在用户看来,应用系统发生的所有异常都是应用系统内部的异常
- 设计一个通用的继承自runtimeException的异常来同一处理;
- 其余异常都统一转译为上述异常AppException;
- 在catch之后,抛出上述异常的子类,并提供足以定位的信息;
- 由前端接收AppException做统一处理
try-catch性能
Java异常处理消耗性能的地方
- try-catch块影响JVM的优化;
- 异常对象实例需要保存栈快照等信息,开销较大;(建议仅捕获可能出现异常的必要的代码段,不要用try-catch包住一个大的代码段 ,也不要用try-catch控制代码流程,因为它的效率远不如if-else,switch之类的高)