Java自定义异常抛出并拦截返回给客户端

246 阅读1分钟

Java 开发中,如果前端传输的数据不符合要求时,我们就需要抛出异常并返回给前端,这里教大家如何自定义异常并拦截返回给前端

image.png

1.用枚举封装返回给前端的状态码 Code

public enum Code {
    SERVICE_BUSY(500, "服务繁忙");

    private Integer code;
    private String msg;

    private Code(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }
}
  1. 创建自定义异常类 MyException
public class MyException extends RuntimeException {
    private Code commonErr;

    public MyException() {
    }

    public MyException(Code commonErr) {
        this.commonErr = commonErr;
    }

    public Code getCommonErr() {
        return commonErr;
    }

    public void setCommonErr(Code commonErr) {
        this.commonErr = commonErr;
    }

    public static void cast(Code commonErr) {
        throw new MyException(commonErr);
    }
}
  1. 创建全局拦截异常的类 GlobalExceptionHandler
  • @ControllerAdvice注解在 Java 中实现全局异常处理
  • @ResponseBody注解用于指示 Spring 将方法返回的对象转换为 HTTP 响应正文
  • @ControllerAdvice@ResponseBody 结合一起使用
  • @RestControllerAdvice@ControllerAdvice@ResponseBody 结合,使用了它就不需要再使用 @ResponseBody
  • @ExceptionHandler(MyException.class)  表示该方法用于处理  MyException  类型的异常。当系统抛出该类型的异常时,该方法将会被调用,并且可以对异常进行处理
  • R 的封装这里就不展示了,可以看往期的文章
import com.xuecheng.base.model.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@Slf4j
//@ControllerAdvice
@RestControllerAdvice
public class GlobalExceptionHandler {
    // @ResponseBody
    @ExceptionHandler(MyException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public R myException(MyException e) {
        //记录异常
        log.error("系统异常 --- ", e.getCommonErr().getMsg(), e);

        return R.error(e.getCommonErr().getCode(), e.getCommonErr().getMsg());
    }
}
  1. controller 抛出测试
@RestController
public class TestController {
    @GetMapping("/test")
    public void test() {
        MyException.cast(Code.SERVICE_BUSY);
    }
}

结果

image.png