自定义异常通过语义化类名、结构化信息封装和协同处理机制显著提升可读性:1. 类名直指业务场景(如UserNotFoundException);2. 内置错误码、提示语等字段并提供getter;3. 与全局处理器配合统一响应;4. 继承体系保持三层简洁结构。

自定义异常能显著提升代码可读性,关键在于让“哪里出错、为什么错、怎么处理”一目了然,而不是靠阅读堆栈或猜测错误含义。
用明确的类名表达业务意图
类名应直接反映业务语义,避免泛化命名(如 MyException 或 BaseException)。开发者看到类名就能判断错误场景,无需点进源码查注释。
- UserNotFoundException —— 比 IllegalArgumentException 更清楚地说明是“用户查不到”,而非笼统的“参数不对”
- InsufficientBalanceException —— 直接体现资金校验失败,比 RuntimeException 或 IllegalStateException 更具上下文
- 避免使用 BusinessException 这类万能兜底类;若必须存在,仅作顶层抽象,具体业务仍需子类化(如 OrderAlreadyShippedException)
封装结构化错误信息,减少字符串拼接
在异常中内建错误码、用户提示语、日志详情等字段,让调用方和日志系统能直接提取结构化数据,避免在 catch 块里手动解析 message 字符串。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 构造时传入 errorCode = "USER_001"、userMessage = "该手机号已被注册"、logDetail = "mobile=138****1234, dbResult=null"
- 提供 getter 方法(如 getErrorCode()),便于全局异常处理器统一组装响应体(如返回 JSON:{"code":"USER_001","msg":"该手机号已被注册"})
- 不依赖 getMessage() 拼接结果,避免因格式变化导致前端解析失败或日志检索困难
与异常处理机制协同,减少冗余逻辑
可读性不仅体现在“抛出时”,更体现在“捕获和响应时”。统一的自定义异常类型,让 try-catch 块逻辑聚焦于行为,而非类型判断。
立即学习“Java免费学习笔记(深入)”;
- 全局异常处理器(@ControllerAdvice)可集中拦截 UserNotFoundException,统一返回 404 + 标准格式,控制器方法里无需写大量 if-else 或重复 try-catch
- 不同异常对应不同 HTTP 状态码(如 InvalidParamException → 400,AuthFailedException → 401),前端按 status 处理,语义清晰
- 测试用例也更直观:可断言是否抛出 PaymentTimeoutException,而非检查 message 是否包含某段文字
保持继承体系简洁,避免过度分层
可读性受损常源于异常体系臃肿。一个清晰的三层结构通常足够:
- 顶层:如 BaseException extends RuntimeException(含通用字段和构造器)
- 中层:按模块划分,如 UserException、OrderException(可选,用于批量捕获)
- 底层:具体场景,如 UserDisabledException、OrderStockShortageException
- 不建议为每个字段校验都建新异常类(如 UserNameTooLongException、UserNameContainsSpecialCharException),可用同一类 + 不同错误码区分

















