SpringBoot全局异常处理
实现全局异常处理
/**
* @Author: CQ
* @Date: 2020/9/3 9:22
* <P> 全局异常的捕获处理</P>
*/
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(ReqFailedException.class)
public ResponseEntity<String> handlerRunException(HttpServletRequest request, RuntimeException ex){
log.error("", ex);
log.error("请求地址:" + request.getRequestURL());
log.error("请求参数: " + JsonUtils.toString(request.getParameterMap()));
return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
}
}
-
@RestControllerAdvice
-
这个注解主要是针对Controller层中@RestController注解,如果你Controller层中使用的是@Controller注解,那么相对的全局异常处理是@ControllerAdvice
-
basePackages:可以指定某些包下面的Controller,如果不指定就是处理整个项目的Controller异常
-
另外一点就是这个全局异常处理器是针对Controller层异常的处理,也就是说所有Service层的异常需要抛到Controller层
-
-
@ExceptionHandler
-
对统一的异常类型进行捕获,针对特定的异常,要进行特定的处理,在代码中处理的是ReqFailedException,所有在Controller层中抛出ReqFailedException异常的都会再这里处理,但是如果直接写ExceptionHandler(Exception.class),就很让很多潜在的bug也被处理从而不暴露出来.但是有的bug是的确要让服务器停止运行修复的,所以要针对抛出的异常进行单独的自定义异常处理
-
另外注意的就是在捕获异常之后,会根据在这里定义的异常进行操作,如果没有定义此异常,那么就去寻找该异常的父级, 如果父级没有就会去找父级的父级 我在这里定义的是ReqFailedException,ReqFailedException继承RuntimeException,RuntimeException又继承Exception,也就是说Controller层抛出ReqFailedException后,会去找我定义ReqFailedException,如果找不到就会去找RuntimeException,RuntimeException找不到就会去找Exception,
-
自定义异常
/**
* @Author: CQ
* @Date: 2020/8/31 18:03
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class ReqFailedException extends RuntimeException {
// 是否成功
private boolean success;
// 提示信息
private String msg;
// 返回状态码
private int status;
public ReqFailedException(BizCode bizCode) {
super(bizCode.getDesc());
this.status = bizCode.getCode();
this.msg = bizCode.getDesc();
this.success = false;
}
public ReqFailedException(String msg) {
super(msg);
this.status = BizCode.REQUEST_FAILED.getCode();
this.msg = msg;
this.success = false;
}
}
Controller
/**
* @author CQO
* @since 2023/03/12 13:53
*/
@RequestMapping("logAspect")
@RestController
public class MySystemLogAspectController {
@PostMapping("test")
public void MySystemLogAspectControllerTest){
System.out.println("ow");
throw new ReqFailedException("自定义异常处理");
}
}