实现全局异常处理
| |
| |
| |
| |
| |
| |
| @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, |
自定义异常
| |
| |
| |
| |
| @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
| |
| |
| |
| |
| @RequestMapping("logAspect") |
| @RestController |
| public class MySystemLogAspectController { |
| |
| |
| @PostMapping("test") |
| public void MySystemLogAspectControllerTest){ |
| |
| System.out.println("ow"); |
| |
| throw new ReqFailedException("自定义异常处理"); |
| |
| } |
| } |
测试结果

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南