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("自定义异常处理");
}
}

测试结果

posted @   unknown-n2  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示

目录导航