全局异常处理

111 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 11 天,点击查看活动详情

本文介绍做全局异常的四大步骤,带你写全局异常处理。细节信息在程序中基本都有解释。
step1:写自定义异常并继承RuntimeException,举例:

public class XueChengPlusException extends RuntimeException{

    //定义变量接错误消息
    private String errMessage;

    //基本的构造函数
    public XueChengPlusException() {
        super();
    }

    public XueChengPlusException(String message) {
        super(message);
        this.errMessage = message;
    }

    public String getErrMessage() {
        return errMessage;
    }

    /**
     * 为方便抛异常,定义静态方法
     * @param errMessage
     */
    public static void cast(String errMessage){
        throw new XueChengPlusException(errMessage);
    }
}

step2:定义通用错误信息,举例:

public enum CommonError {
    UNKOWN_ERROR("执行过程异常,请重试。"),
    PARAMS_ERROR("非法参数"),
    OBJECT_NULL("对象为空"),
    QUERY_NULL("查询结果为空"),
    REQUEST_NULL("请求参数为空");

    private String errMessage;

    public String getErrMessage() {
        return errMessage;
    }
    private CommonError( String errMessage) {
        this.errMessage = errMessage;
    }
}

step2-1:在自定义异常中加入通用异常的处理,加入下面代码到step1:

    /**
     * 静态重载方法,抛通用异常
     * @param commonError
     */
    public static void cast(CommonError commonError){
        throw new XueChengPlusException(commonError.getErrMessage());
    }

step3:包装错误响应

public class RestErrorResponse implements Serializable {
    private String errMessage;
    public RestErrorResponse(String errMessage){
        this.errMessage= errMessage;
    }
    public String getErrMessage() {
        return errMessage;
    }
    public void setErrMessage(String errMessage) {
        this.errMessage = errMessage;
    }
}

step4:全局异常处理,举例:

@Slf4j
@ControllerAdvice  //控制器增强
public class GlobalExceptionHandler {
    //处理自己的异常XueChengPlusException,此类异常由我们(程序员)主动抛出,可预知的异常

    /**
     * //@ExceptionHandler是Spring3.0提供的标识在方法上或类上的注解,用来表明方法的处理异常类型。
     * @param e
     */
    @ResponseBody //将信息返回为json
    @ExceptionHandler(XueChengPlusException.class) //此方法就捕获XueChengPlusException异常
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) //这个注解告诉方法最后要返回500
    public RestErrorResponse doXueChengPlusException(XueChengPlusException e){
        //加一个日志来捕获异常信息
        log.error("捕获异常: {}",e.getErrMessage());
        e.printStackTrace();

        String errMessage = e.getErrMessage();
        return new RestErrorResponse(errMessage);
    }
    //捕获不可预知的异常Exception
    @ResponseBody //将信息返回为json
    @ExceptionHandler(Exception.class) //此方法就捕获XueChengPlusException异常
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) //这个注解告诉方法最后要返回500
    public RestErrorResponse doException(Exception e){
        //加一个日志来捕获异常信息
        log.error("捕获异常: {}",e.getMessage());
        e.printStackTrace();
//        return new RestErrorResponse(e.getMessage());
        return new RestErrorResponse(CommonError.UNKOWN_ERROR.getErrMessage());
    }
}

返回的将是json类型的异常信息,数据是由step3规定的。最后是测的错误返回:

image.png