java自定义异常应继承runtimeexception,用枚举统一管理错误码与消息,提供多构造函数支持占位符填充和异常包装,并分离message(用户提示)与context(系统上下文)字段。

在 Java 中,自定义异常类封装错误码和错误信息,核心是让异常本身成为“结构化错误载体”,而不是一串不可解析的字符串。关键不在于抛出异常,而在于怎么装、怎么传、怎么用。
继承 RuntimeException,不强制捕获
业务异常属于流程中的正常拒绝分支(比如“用户名已存在”),不是程序崩溃。直接继承 RuntimeException 即可:
- 调用方无需写 try-catch 或 throws,接口更干净
- Spring 的 @Transactional 默认对 RuntimeException 回滚,语义一致
- @RestControllerAdvice 默认只拦截非受检异常,统一处理才生效
用枚举集中管理错误码与默认消息
错误码不能硬编码在构造函数里,也不能散落在各处。定义一个 ErrorCode 枚举,每个项包含:
- 唯一数字码(如 1001)或业务标识符(如 USER_NOT_FOUND)
- 默认提示模板(如 "用户 {0} 不存在")
- 可选 HTTP 状态建议(如 HttpStatus.NOT_FOUND)
这样既支持前端按 code 映射文案,也方便后续接入国际化(i18n)或监控统计错误率。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
异常类提供多构造函数,覆盖典型场景
只写一个构造函数会丢失调试线索。至少提供三种:
- ErrorCode 构造:仅传枚举项,自动取默认消息,适合简单校验失败
- ErrorCode + args 构造:支持 MessageFormat.format 填充占位符,如 "订单 {0} 已超时"
- ErrorCode + message + cause 构造:包装底层异常(如 SQLException),保留原始堆栈链
每个构造函数都必须调用 super(message, cause) 或 super(message),否则 getMessage() 可能返回 null,日志第一行就失效。
字段设计要区分用途:message 给人看,context 给系统用
不要把用户 ID、订单号等上下文拼进 message 字符串:
- message 是面向用户/开发者的可读提示,支持占位符和 i18n
-
context(如 Map
)存入现场数据,供日志框架提取、链路追踪关联、告警规则匹配 - code 必须是 int 或 String 类型,避免用 HTTP 状态码混用(404 是协议层概念,RPC 调用不适用)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










