自定义异常通过统一异常机制替代嵌套校验和多层 try-catch,使业务代码扁平化、可读性强;推荐分层定义领域/应用/接口异常,并配合全局处理器实现零侵入式错误处理。

Java 中自定义异常本身不直接“简化判断逻辑”,但它能显著减少多层嵌套的 try-catch 和条件校验结构,让业务代码更扁平、可读、易维护。核心思路是:**用异常代替层层 if-return 或 try-catch 嵌套,把“失败路径”统一交给异常机制和全局处理器处理**。
用 RuntimeException 子类替代嵌套校验分支
当多个业务规则需依次校验(如用户存在 → 余额充足 → 订单未锁定),传统写法容易变成:
// 易读性差、缩进深、返回路径分散而改用自定义异常后,可写成线性流程:
- 每个校验点只做一件事:不满足就抛出语义明确的异常(如
UserNotFoundException、InsufficientBalanceException) - 方法体保持“主干清晰”,无提前 return 或嵌套 if
- 所有异常最终由统一处理器捕获并转为标准响应
配合异常链保留原始上下文,避免嵌套捕获再重抛
遇到底层技术异常(如 DAO 抛 SQLException),不要在 service 层用 try-catch 包一层再 throw 新异常——除非你传了 cause:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- ✅ 正确:
throw new BusinessException("扣款失败", sqlEx);—— 一行完成封装,堆栈里仍能看到 SQL 错误根源 - ❌ 错误:
throw new BusinessException("扣款失败");—— 根因丢失,排查时只能看到空泛提示 - 这样就不需要在外层再套 try-catch 来“保护日志记录”或“补充信息”,消除嵌套层级
分层定义异常类型,让不同模块各司其职
避免一个 BusinessException 扛下所有错误,否则调用方无法区分处理策略。推荐三类划分:
-
领域异常(如
OrderAlreadyShippedException):domain 层抛出,描述“业务规则为何不成立”,不带 HTTP 细节 -
应用异常(如
OrderCreationFailedException):application 层聚合多个领域异常,表达“用例执行失败” -
接口异常(如
OrderConflictApiException):controller 层专用,含errorCode和HttpStatus,前端可直接映射提示
分层后,service 方法无需 try-catch,controller 也只需声明捕获顶层接口异常,中间层不参与异常流转决策。
结合全局异常处理器,业务方法彻底去 try-catch
Spring 项目中,用 @ControllerAdvice + @ExceptionHandler 统一收口:
- 所有业务方法专注执行逻辑,出错直接 throw 自定义异常(含 cause)
- 处理器负责:记录完整堆栈(
e.getCause()可追溯)、补全 traceId、构造 JSON 响应 - 结果是:90% 的业务方法里看不到
try、catch、throws关键字

















