0%

spring | 统一处理异常 @ControllerAdvice 和 @ExceptionHandler

参考 统一异常处理与统一结果返回

@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;
}
}

全局处理异常类

我们可以自定义一个全局异常处理类,来处理各种异常,包括自己定义的异常和内部异常。这样可以简化不少代码,不用自己对每个异常都使用 trycatch的方式来实现。

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;
}
}
请我喝杯咖啡吧~