一光年

[Spring-架构] SpringBoot中的异常处理架构该如何设计(一)

2019.06.14

对于Spring框架的异常处理,通常有三种处理方式:

  1. 使用 @ExceptionHandler 注解
  2. 实现 HandlerExceptionResolver 接口
  3. 使用 @ControllerAdvice注解

其中,@ExceptionHandler注解和另外两种方式解决的问题是不一样的。前者是用于集中解决某一类异常,后者则是将框架中所有异常集中处理。

@ExceptionHandler的第一句注释如下,可见它只在某个类或方法中才可以被调用。

Annotation for handling exceptions in specific handler classes and/or handler methods.

对于应用整体来讲,集中处理所有异常具有显而易见的好处。

  1. 方便系统异常的统一管理
  2. 方便API返回的统一处理
  3. 业务代码可以去除try/catch处理,更为简洁

综上说明,我们可以结合方式1和方式3,集中处理所有类型的系统异常。

...
@ControllerAdvice
public class ControllerExceptionHandler {

    @ExceptionHandler(AppException.class)
    public Object handleAppException(AppException e) {
        return Response.fail(e.getCode(), e.getMessage());  // 返回App异常的错误信息
    }

    @ExceptionHandler(ShiroException.class)
    public Object handleShiroException(ShiroException e) {
        return Response.badJwtToken();
    }

    ...
    // 其它异常处理
}

在Controller层中,则可在必要时摈弃try/catch处理直接抛出异常,让异常公共处理来负责返回统一的Response。