全局异常处理


传送门:
spring-boot-route(四)全局异常处理

@ControllerAdvice注解说明传送门

统一异常处理



在开发中,我们经常会使用try/catch块来捕获异常进行处理,如果有些代码中忘记捕获异常或者不可见的一些异常出现,就会响应给前端一些不友好的提示,这时候我们可以使用全局异常处理。这样就不用在代码中写那些烦人的try/catch块了,代码的可读性也会提高。

SpringBoot提供的的注解@ControllerAdvice 配合 @ExceptionHandler 实现全局异常处理

定义响应状态码及信息的枚举类

public enum ErrorCodeEnum {
SUCCESS(0, "请求成功"),
ERROR(500, "未知异常"),
ERROR_EMPTY_RESULT(1001, "查询结果为空"),
ERROR_INCOMPLETE_RESULT(1002, "请求参数不全");
private int code;
private String message;
ErrorCodeEnum(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}

自定义异常类

public class CutsomException extends Exception {
private int code;
private String message;
public CutsomException(ErrorCodeEnum errorCodeEnum) {
this.code = errorCodeEnum.getCode();
this.message = errorCodeEnum.getMessage();
}
}

定义全局异常处理类

由于这里我想要响应的结果为实体类对象,因此我直接用@RestControllerAdvice来代替了@ControllerAdvice,这两个注解的差别跟@Controller@RestController一样,rest的响应体为json格式的数据。

@RestControllerAdvice
public class GlobalExceptionHandle {
/**
* 处理自定义异常
*
* @param e
* @return
*/
@ExceptionHandler(CustomException.class)
public RestResult customExceptionHandler(CustomException e) {
// 日志打印等处理
System.out.println("进入全局异常-自定义异常处理");
RestResult restResult = new RestResult();
restResult.setCode(e.getCode());
restResult.setErrMsg(e.getErrMsg());
return restResult;
}
/**
* 其他异常处理
*
* @param e
* @return
*/
@ExceptionHandler
public RestResult otherExceptionHandler(Exception e) {
return RestResult.failResult(e.getMessage());
}
}

测试自定义异常

@RestController
@RequestMapping("/curl-test")
public class DemoController {
@GetMapping("/test-exception")
public RestResult testCustomException(String flag) throws Exception {
if ("1".equals(flag)) {
throw new CustomException(ErrorCodeEnum.ERROR_INCOMPLETE_RESULT);
}
if ("2".equals(flag)) {
throw new Exception("其他异常");
}
return RestResult.successResult();
}
}

posted @   Lz_蚂蚱  阅读(34)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起