一、引言

我们在做后端开发的时候,程序可能会出现各种运行时异常,当用户请求接口之后,会将异常赤裸裸地展示在页面上,使得用户体验极差,那么一个集中的处理异常的类就显得尤为重要。集中处理异常可以使代码容易维护,减少代码的冗余。

二、处理异常步骤

  1. 创建一个Result类,用于封装返回的数据
public class Result {
    /**
     * 请求是否成功
     */
    private Boolean flag;
    /**
     * 响应状态码
     */
    private Integer code;
    /**
     * 提示信息
     */
    private String message;
    /**
     * 返回数据
     */
    private Object data;
    //getter setter
    }
  1. 创建一个BaseExceptionHandler类,用于处理异常
@ControllerAdvice
public class BaseExceptionHandler {
private Logger logger = LoggerFactory.getLogger(this.getClass());
	
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Result handler(Exception e){
        logger.error(e.getMessage(),e);
        return new Result(false, 500,"服务器内部错误");
    }
}

此时如果接口出现异常,则会返回友好的提示语。

三、扩展

有时候由于业务的需要,我们需要自定义异常,当抛出自定义异常后,就执行某些操作。

  1. 先创建一个自定义异常类,继承RuntimeException,直接继承父类的构造方法
public class ServiceException extends RuntimeException{

    public ServiceException() {
    }

    public ServiceException(String message) {
        super(message);
    }
}
  1. 在原有的异常处理类上针对这一异常作处理
@ControllerAdvice
public class BaseExceptionHandler {
private Logger logger = LoggerFactory.getLogger(this.getClass());

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Result handler(Exception e){
        if(e instanceof ServiceException){
        	//处理的业务逻辑
            return new Result(false,400,e.getMessage());
        }
        logger.error(e.getMessage(),e);
        return new Result(false, 500,"服务器内部错误");
    }
}

Q.E.D.


愿你编码半生,归来仍是少年