Java自定义业务异常应继承RuntimeException,以ErrorCode枚举统一管理错误码与消息,提供标准构造方法并配合@ControllerAdvice全局处理,返回标准化JSON响应。

在 Java 中,自定义业务异常类继承 RuntimeException 是实现“非检查型异常(unchecked exception)”的常用方式,适用于业务逻辑中可预期但不应由调用方强制处理的错误场景(如参数校验失败、权限不足、状态不合法等)。关键在于规范设计:统一结构、明确语义、便于日志记录与前端提示。
命名与继承规范
业务异常类应以 Exception 结尾,体现其异常本质;继承 RuntimeException,避免强制 try-catch;推荐使用 BusinessException 作为基类,其他具体异常可继承它(形成层次),也可直接继承 RuntimeException(扁平化)。
- ✅ 推荐命名:
UserNotFoundException、InsufficientBalanceException、OrderStatusInvalidException - ❌ 避免命名:
UserNotFound(缺 Exception 后缀)、UserNotFoundRuntimeEx(冗余且不直观) - 基类建议提供标准构造方法:含错误码(code)、错误消息(message)、可选 cause
包含错误码与国际化支持
纯 message 字符串不利于前后端协作和多语言适配。应在异常类中内置 errorCode(如字符串或枚举),配合资源文件或配置中心实现提示语分离。
- 定义枚举
ErrorCode,如USER_NOT_FOUND("BIZ_001", "用户不存在") - 自定义异常构造时接收
ErrorCode,内部自动设置 message 和 code - 避免在 new 异常时硬编码中文,例如:
throw new UserNotFoundException("用户不存在")→ 不推荐 - 推荐写法:
throw new UserNotFoundException(ErrorCode.USER_NOT_FOUND)
提供标准构造方法与链式能力
确保异常支持常见使用方式:仅带错误码、带错误码和额外信息、带错误码和原始异常(用于包装底层异常)。
立即学习“Java免费学习笔记(深入)”;
public BusinessException(ErrorCode code)-
public BusinessException(ErrorCode code, String detailMessage)(detailMessage 可拼入日志,不暴露给前端) public BusinessException(ErrorCode code, Throwable cause)public BusinessException(ErrorCode code, String detailMessage, Throwable cause)- 重写
getErrorCode()方法,方便全局异常处理器提取
配合全局异常处理器统一响应
自定义异常的价值需通过统一拦截来兑现。Spring Boot 中使用 @ControllerAdvice + @ExceptionHandler 捕获业务异常,返回标准化 JSON 响应(如 { "code": "BIZ_001", "msg": "用户不存在", "data": null })。
- 在 handler 中区分
BusinessException与其他异常(如IllegalArgumentException),前者返回 200 + 业务错误码,后者可返回 400 - 避免在 controller 内吞掉业务异常后返回 success 状态码
- 日志记录建议:打印 error level + errorCode + detailMessage + cause(如有)
不复杂但容易忽略:异常类本身要 serialVersionUID(若涉及序列化)、保持无状态、不可变(字段 final)、避免持有敏感上下文对象(如 request、session)。


















