实践Java异常处理

Throwable

Error是一种非常特殊的异常类型,它的出现标识着系统发生了不可控的错误 , 例如 StackOverflowError、OutOfMemoryError。针对此类错误,程序无法处理,只能人工介入。

checked异常是需要在代码中显式处理的异常 , 否则会编译出错。如果能自行处理则可以在当前方法中捕获异常,如果无法处理,则继续向调用方抛出异常对象。可以分为两类:

  • 无能为力、引起注意型。

    针对此类异常,程序无法处理 , 如字段超长等导致的 SQLException , 即使做再多的重试对解决异常也没有任何帮助 , 一般处理此类异常的做法是完整地保存异常现场,供开发工程师介入解决。

  • 力所能及、坦然处置型

    如发生未授权异常 ( UnAuthorizedException ) , 程序可跳转至权限申请页面。

unchecked异常运行时异常,继承自RuntimeException,不需要程序显式的捕捉和处理,因为默认unchecked异常在正常情况下不会发生,好比说没有消息就是好消息,发生unchecked异常是因为运行时出现了非预期的情况,当非预期的情况不存在时,unchecked异常自然也不会发生,unchecked异常不是程序必须处理的(一般需要处理发生unchecked异常时的友好性等)。可以分为三类:

  • 可预测异常( Predicted Exception )

    常见的可预测异常包括IndexOutOtBoundsException 、 NullPointerException 等,基于对代码的性能和稳定性要求 , 此类异常不应该被产生或者抛出,而应该提前做好边界检查、空指针判断等处理。显式的声明或者捕获此类异常会对程序的可读性和运行效率产生很大影响。

  • 需捕捉异常( Caution Exception )

    例如在使用Dubbo框架进行RPC调用时产生的远程服务超时异常DubboTimeoutException,此类异常是客户端必须显式处理的异常,不能因服务端的异常导致客户端不可用,此时处理方案可以是重试或者降级处理等。

  • 可透出异常(Ignored Exception)

    主要是指框架或系统产生的且会自行处理的异常,而程序无须关心。例如针对 Spring 框架中抛出的NoSuchRequestHandlingMethodException 异常,Spring 框架会自己完成异常的处理,默认将自身抛出的异常自动映射到合适的状态码,比如启动防护机制跳转到 404 页面。