一、异常框架概述
1、异常体系架构
JDK 定义了 套完整的异常机制,所有异常都是 Throwable 的子类,分为Error(致命异常)和Exception(非致命异常)。
致命异常:Error | 非致命异常:Exception |
---|---|
Error是一种非常特殊的异常,他的出现标志着系统出现了不可控的错误,如StackOverflowError、OutOfMemoryErroy。这类错误程序无法处理,只能人工介入处理。 | 非受检异常:就是该异常不需要在程序中显示的捕捉和处理,它们都继承RuntimeException。 |
受检异常:需要在代码中现实的处理异常,否则编译出错。该异常如果能自行处理就在当前方法中捕获处理,否则继续向调用方抛出。常见的受检异常:SQLException、ClassNotFoundException等 |
2、异常框架使用准则
上面我们大致介绍了异常框架的结构,但是在开发中我们该如何处理和记录异常呢?
-
受检异常:checkedException
受检异常使我们必须try{}catch(){}来获取和处理的,但是有些是异常又可以细分为两类:一类是我们有能力处理的,另一类是我们没有能力处理的。
有能力处理:力所能及,坦然处置。如发生了未授权异常,让程序跳到权限申请页面去。
无能力处理:无能为力,引起注意。就是完整的保存好现场,以便开发接入解决。如字段超长导致的SQLException,即使程序做再多的重试也不能解决问题,所以此类异常的做法是完整的保存异常现场,供开发工程师接入解决。 -
非受检异常:RuntimeException
非受检异常又可以分为三类:可预测的异常、需要捕获的异常、可透出异常。
可预测异常:就是由于数据导致的可以被我们预测到的异常如:IndexOutOfBoundException、NullPointerException等;基于对代码和性能以及稳定性的要求,此类异常不应该被产生和抛出,应该做好NPE和边界检查等处理;显示的生命或者捕获此类异常对程序的可读性和运行效率产生很大影响。
需要捕获异常:需要捕获的运行时异常,如Dubbo框架进行RPC调用时产生的远程服务超时异常DubboTimeoutException,此类异常是客户端必须显示处理的异常,不能因为远程服务不可用而导致本服务不可用,处理方案可以是重试、降级处理。
可透出异常:主要是我们自己的框架或系统产出的我们自己可以处理的异常,如spring框架自己抛出NoSuchRequestHandlingMethodExceptin异常,自己会根据自己的策略选择和处理这个异常,再如我们系统抛出的自定义业务异常,我们捕获后转乘对应的状态码。