图示如下:
- 无能为力、引起注意型:针对此类异常,程序无法处理。如字段超长等导致的SQLException,即使做再多的重试对解决异常也没有任何帮助,一般处理此类异常的做法是完整地保存异常现场,供开发工程师介入解决。
- 力所能及、坦然处置型:如发生未授权异常(UnAuthorizedException),程序可跳转至权限申请页面。
- 可预测异常(Predicted Exception): 常见的可预测异常包括IndexOutOfBoundsException、NullPointExceptin等,基于对代码的性能和稳定性要求,此类异常不应该被产生或者抛出,而应该提前做好边界检查、空指针判断等处理。显式的声明或者捕获此类异常会对程序的可读性和运行效率产生很大影响。
- 需捕捉异常(Caution Exception):例如在使用Dubbo框架进行RPC调用时产生的远程服务超时异常DubboTimeoutException,此类异常时客户端必须显式处理的异常,不能因服务端的异常导致客户端不可用,此时处理方案可以是重试或者降级处理等。
- 可透出异常(Ignored Exception):主要是指框架或系统产生的且会自行处理的异常,而程序无须关心。例如针对Spring框架中抛出的NoSuchRequestHandlingMethodException异常,Spring框架会自己完成异常的处理,默认将自身抛出的异常自动映射到合适的状态码,比如启动防护机制跳转到404页面。
异常的抛与接
传递异常信息的方式通过抛出异常对象,还是把异常信息转成信号量封装在特定对象中,这需要方法提供者和方法调用者之间达成契约,只有大家都照章办事,才不会产生误解。推荐对外提供的开放接口使用错误码;公司内部跨应用远程服务调用优先考虑使用Result对象来封装错误码、错误描述信息;而应用内部则推荐直接抛出异常对象。