java业务异常处理的核心是定义规范异常类、全局处理器、国际化支持和前端友好响应结构:继承runtimeexception封装错误码与参数,@controlleradvice统一拦截并返回含code/message的标准json,通过messagesource按locale解析多语言提示,错误码全大写下划线分隔且与国际化键严格一致。

Java 异常处理中,通过统一拦截业务异常并向前端输出清晰、可国际化的错误提示,核心在于:定义规范的业务异常类 + 全局异常处理器 + 国际化资源支持 + 前端可解析的响应结构。
定义标准化的业务异常类
避免直接抛出 RuntimeException 或原生异常,而是封装带错误码和默认消息的业务异常:
- 继承
RuntimeException,不强制上层捕获,符合业务异常语义 - 构造时传入唯一错误码(如
"USER_NOT_FOUND"),用于定位和国际化键名 - 可选携带动态参数(如用户名、ID),用于填充提示中的占位符
- 示例:
throw new BusinessException("ORDER_INVALID_STATUS", orderId);
配置全局异常处理器(@ControllerAdvice)
用 @ControllerAdvice 拦截所有控制器抛出的异常,统一格式化响应:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 单独处理
BusinessException,提取错误码,从MessageSource获取对应国际化消息 - 对其他未预期异常(如
NullPointerException)记录日志并返回通用错误码(如"SYSTEM_ERROR"),避免泄露敏感信息 - 响应体保持固定结构,例如:
{"code": "USER_NOT_FOUND", "message": "用户不存在", "timestamp": "..."} - 确保响应状态码合理(业务异常常用
400或自定义200+ code 字段,按团队规范)
集成 Spring MessageSource 实现多语言支持
利用 Spring 内置的 MessageSource 管理不同语言的错误提示:
- 在
resources下创建messages.properties(默认)、messages_zh_CN.properties、messages_en_US.properties - 键名与业务异常码严格一致,例如:
USER_NOT_FOUND=用户不存在,USER_NOT_FOUND=User not found - 处理器中通过
messageSource.getMessage(code, args, locale)动态解析,locale可从请求头(Accept-Language)或登录用户偏好获取 - 若找不到对应键,返回默认提示(如
"未知错误")而非空字符串,保障健壮性
前端友好:响应结构与错误码设计原则
让前端能稳定消费错误信息,关键在约定而非灵活性:
- 错误码全大写、下划线分隔(如
INSUFFICIENT_BALANCE),便于前后端对照文档或枚举 - 响应体中
code字段始终为业务错误码(非 HTTP 状态码),message是已翻译的最终文案 - 避免在 message 中拼接参数(如
"用户 " + name + " 不存在"),全部交由国际化占位符处理(USER_NOT_FOUND=用户 {0} 不存在) - 可额外提供
details字段存放技术上下文(如 traceId、参数值),仅用于排查,不展示给用户
不复杂但容易忽略的是:错误码命名需业务域收敛、国际化键必须全覆盖、异常处理器要区分可信业务异常与不可信系统异常。做好这三点,前端拿到的提示自然清晰、准确、可维护。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










