在 Java 开发中,如果前端传输的数据不符合要求时,我们就需要抛出异常并返回给前端,这里教大家如何自定义异常并拦截返回给前端
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;
}
}
- 创建自定义异常类
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);
}
}
- 创建全局拦截异常的类
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());
}
}
- 在
controller抛出测试
@RestController
public class TestController {
@GetMapping("/test")
public void test() {
MyException.cast(Code.SERVICE_BUSY);
}
}
结果