SpringMVC提供了一套解决全局异常的处理方案,可以在代码无侵入的前提下完成异常处理。遵循逐层抛出,异常处理器统一处理的思路
首先 先创建一个异常类 ErrorResult 里面两个属性分别是 错误码 和错误信息
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ErrorResult {
private String errCode;
private String errMessage;
public static ErrorResult error() {
return ErrorResult.builder().errCode("999999").errMessage("系统异常").build();
}
public static ErrorResult codeNotExitError() {
return ErrorResult.builder().errCode("000001").errMessage("redis不存在验证码").build();
}
public static ErrorResult codeError() {
return ErrorResult.builder().errCode("000002").errMessage("验证码错误").build();
}
public static ErrorResult loginError() {
return ErrorResult.builder().errCode("000003").errMessage("登录失败").build();
}
public static ErrorResult faceError() {
return ErrorResult.builder().errCode("000004").errMessage("人脸识别失败").build();
}
}
创建 MyException 继承自 RuntimeException 里面注入我们自己写的异常类
import com.tanhua.vo.ErrorResult;
import lombok.Data;
@Data
public class MyException extends RuntimeException {
//错误类
private ErrorResult errorResult;
/**
* @Description: 修改父类的构造方法
* @Param: [errorResult]
* @return:
* @Author:
* @Date:
*/
public MyException(ErrorResult errorResult) {
super(errorResult.getErrMessage());
this.errorResult = errorResult;
}
}
写一个 用于集中处理控制器抛出的异常 可以定义一下通用的异常处理逻辑 全局异常处理类
import com.tanhua.vo.ErrorResult;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
/**
* Created with IntelliJ IDEA.
*
* @Author:
* @Date:
* @Message: Talk is cheap. Show me the code.
* @Description: 用于集中处理控制器抛出的异常 可以定义一下通用的异常处理逻辑 全局异常处理类
*/
@ControllerAdvice
public class ExceptionAdvice {
/**
* @Description: 统一异常处理 拦截器抛出的MyException异常
* @Param: [e]
* @return: org.springframework.http.ResponseEntity
* @Author:
* @Date:
*/
@ExceptionHandler(MyException.class)
public ResponseEntity handleMyException(MyException e) {
e.printStackTrace();
ErrorResult errorResult = e.getErrorResult();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResult);
}
/**
* @Description: 拦截跑出的 Exception 的异常
* @Param: [e]
* @return: org.springframework.http.ResponseEntity
* @Author:
* @Date:
*/
@ExceptionHandler(Exception.class)
public ResponseEntity handleException(Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ErrorResult.error());
}
}
里面两个方法分别 捕捉 MyException类异常 和 Exception 类异常 捕捉到了就会执行方法
使用方法 在需要抛出异常的地方编写
throw new MyException(ErrorResult.faceError());