java自定义异常需继承runtimeexception、全局处理器用@restcontrolleradvice+@exceptionhandler明确捕获、业务层主动throw,三者缺一不可。

Java 自定义异常要在全局异常处理器中被正确捕获,关键在于三点:异常类设计合理、全局处理器明确声明捕获目标、业务代码中主动抛出该异常。只要链路打通,Spring Boot 就能自动路由到对应处理方法。
自定义异常类要继承 RuntimeException 或 Exception
多数业务异常推荐继承 RuntimeException(非检查型异常),避免强制 try-catch 干扰逻辑流。构造时建议携带错误码和消息:
- 用枚举统一管理错误码和提示,比如
RespBeanEnum.PARAM_ERROR - 在自定义异常构造器中接收枚举或直接传入
code和msg - 重写
getCode()和getMsg()方法便于后续提取
全局异常处理器需用 @RestControllerAdvice + @ExceptionHandler 显式声明
@RestControllerAdvice 是最常用方式,它等价于 @ControllerAdvice + @ResponseBody,天然适配 REST 接口返回 JSON。捕获时必须指定异常类型:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 写法示例:
@ExceptionHandler(BusinessException.class) - 不要只写
@ExceptionHandler(Exception.class)做兜底,否则会覆盖更具体的处理逻辑 - 可同时捕获多个异常:
@ExceptionHandler({BusinessException.class, ValidationException.class})
业务层必须 throw 出这个自定义异常
全局处理器不会自动拦截所有潜在问题——它只响应被 显式抛出 的异常。所以:
- 在 Service 或 Controller 中,用
throw new BusinessException(RespBeanEnum.USER_NOT_FOUND)主动中断流程 - 不要用
new BusinessException(...).printStackTrace()这类忽略式处理 - 校验失败、参数非法、资源不存在等场景,都应统一抛出自定义异常,而非返回 null 或 false
确保包扫描能覆盖到异常类和处理器类
如果捕获不生效,大概率是 Spring 没加载到你的类:
- 自定义异常放在
exception包下,全局处理器也放在同级或子包(如exception.handler) - 确认启动类所在包路径能扫描到它们,必要时加
@ComponentScan显式指定 - 检查类上有没有拼错注解,比如写成
@ControllerAdvicee或漏掉@ResponseBody(若没用@RestControllerAdvice)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










