Java自定义异常需配合全局异常处理器使用:业务层抛ServiceException,@RestControllerAdvice统一拦截并封装标准响应,错误码与提示信息由枚举预设,非检查型异常避免强制try-catch,404等HTTP错误需额外配置ErrorController处理。

Java 中自定义异常要真正发挥作用,必须和全局异常处理器配合使用——不是抛出去就完事,关键在于“抛得准、捕得全、回得清”。核心逻辑是:业务层主动抛出自定义异常(如 ServiceException),由全局处理器统一拦截、解析、封装成标准响应体返回给前端,避免堆栈暴露、页面崩溃或状态码错乱。
自定义异常类要带业务语义
继承 RuntimeException(非检查型),避免强制 try-catch 干扰业务流;至少包含错误码(code)和提示信息(msg),推荐用枚举预设常见错误,提升可维护性:
- 定义枚举
ResponseEnum:如SUCCESS(200, "操作成功")、PARAM_ERROR(400, "参数不合法") - 异常类构造支持传入枚举:自动提取 code/msg,也支持手动传参灵活覆盖
- 不重写
getMessage(),保持父类行为;提供getCode()和getMsg()供处理器读取
全局处理器用 @RestControllerAdvice 统一拦截
加 @RestControllerAdvice 注解的类,会自动作用于所有 @RestController 方法。用 @ExceptionHandler 指定捕获目标异常类型:
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
- 优先处理你自己的异常,例如
@ExceptionHandler(ServiceException.class) - 再兜底捕获
Exception.class,防止漏掉未预期异常 - 方法返回值直接是 JSON 响应体(如
Result.fail(e.getCode(), e.getMsg())),无需@ResponseBody - 可配合
@ResponseStatus设置 HTTP 状态码,比如参数异常返回400 BAD_REQUEST
业务代码里只管“抛”,不写 try-catch
在 Service 或 Controller 层,发现业务违规(如用户不存在、余额不足、参数为空)时,直接 throw new ServiceException(ResponseEnum.USER_NOT_FOUND):
- 不 try-catch 自己抛的异常,否则中断不了流程,还可能掩盖问题
- 也不用在每个方法上声明
throws,因为是非检查型异常 - 让异常自然向上冒泡,直到被全局处理器接住
注意区分两类“全局”场景
一种是接口层异常(Controller 抛出),用 @RestControllerAdvice 足够;另一种是更底层的错误(如 404、401、静态资源缺失),它们甚至没进 Controller,这时需配合 ErrorController 或配置 server.error.whitelabel.enabled=false + 自定义 error 页面:
-
@RestControllerAdvice管的是 Spring MVC 流程内的异常 - HTTP 状态码层面的错误(如 404)默认由 Spring Boot 的 BasicErrorController 处理,可继承重写
- 线程级未捕获异常(如异步任务中)需单独设置
Thread.setDefaultUncaughtExceptionHandler
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










