参考 统一异常处理与统一结果返回
@ControllerAdvice
注解以及 @ExceptionHandler
注解,前者是用来开启全局的异常捕获,后者则是说明捕获哪些异常,对那些异常进行处理。
统一结果返回与统一异常。
返回 Result
1 2 3 4 5 6 7
| @Data public class Result<T> { private Boolean success; private Integer code; private String msg; private T data; }
|
枚举 错误代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public enum ErrorEnum { SUCCESS(200, "nice"), NO_PERMISSION(403,"你没得权限"), NO_AUTH(401,"你能不能先登录一下"), NOT_FOUND(404, "未找到该资源!"), INTERNAL_SERVER_ERROR(500, "服务器跑路了"), ;
private Integer errorCode; private String errorMsg;
ErrorEnum(Integer errorCode, String errorMsg) { this.errorCode = errorCode; this.errorMsg = errorMsg; }
public Integer getErrorCode() { return errorCode; }
public String getErrorMsg() { return errorMsg; } }
|
自定义异常类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public class DefinitionException extends RuntimeException{
protected Integer errorCode; protected String errorMsg;
public DefinitionException(){
} public DefinitionException(Integer errorCode, String errorMsg) { this.errorCode = errorCode; this.errorMsg = errorMsg; }
public Integer getErrorCode() { return errorCode; }
public void setErrorCode(Integer errorCode) { this.errorCode = errorCode; }
public String getErrorMsg() { return errorMsg; }
public void setErrorMsg(String errorMsg) { this.errorMsg = errorMsg; } }
|
全局处理异常类
我们可以自定义一个全局异常处理类,来处理各种异常,包括自己定义的异常和内部异常。这样可以简化不少代码,不用自己对每个异常都使用 try
,catch
的方式来实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| @ControllerAdvice public class GlobalExceptionHandler {
@ExceptionHandler(value = DefinitionException.class) @ResponseBody public Result bizExceptionHandler(DefinitionException e) { return Result.defineError(e); }
@ExceptionHandler(value = Exception.class) @ResponseBody public Result exceptionHandler( Exception e) { return Result.otherError(ErrorEnum.INTERNAL_SERVER_ERROR); } }
|
说明:每个方法上面加上一个 @ResponseBody
的注解,用于将对象解析成 json
,方便前后端的交互,也可以使用 @ResponseBody
放在异常类上面。
controller 用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @RestController @RequestMapping("/result") public class ResultController {
@RequestMapping("/getDeException") public Result DeException(){ throw new DefinitionException(400,"我出错了"); }
@RequestMapping("/getException") public Result Exception(){ Result result = new Result(); int a=1/0; return result; } }
|