java中应为各业务模块定义语义明确的自定义异常子类,如orderexception、paymentexception,并通过统一基类businessexception继承,配合模块前缀错误码(如order_001)和全局异常处理器实现精准响应与可维护性。

在 Java 中为不同业务模块划分自定义异常子类,核心是遵循「一个模块对应一组语义明确的异常类」,同时保持继承结构清晰、职责分明。不建议所有模块共用几个泛型异常,也不推荐为每个方法都建一个异常类——关键在于平衡可维护性与表达力。
按业务域分包 + 统一基类
先定义一个顶层业务异常基类(非必须但推荐),再为每个核心业务模块建独立包,包内定义各自的异常子类:
-
顶层基类:如
BusinessException(继承RuntimeException),含通用字段(错误码、提示语、日志 ID) -
模块包结构:
com.example.order.exception.OrderExceptioncom.example.payment.exception.PaymentExceptioncom.example.user.exception.UserException
-
每个模块异常可进一步细分:比如
OrderAlreadyShippedException、InsufficientStockException,都继承自OrderException
异常命名体现业务语义和错误阶段
名称要让人一眼看懂“谁出了什么问题”,避免 InvalidParamException 这类模糊命名:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅
UserNotFoundException(查不到用户) - ✅
PaymentTimeoutException(支付超时) - ✅
InventoryLockFailedException(库存加锁失败) - ❌
BaseException、ServiceException(太泛,失去区分度)
配合错误码体系统一管理
每个自定义异常类应绑定唯一业务错误码(如 ORDER_001、PAY_003),便于日志追踪、前端提示、监控告警:
- 在异常构造时传入错误码:
throw new OrderAlreadyShippedException("ORDER_007", "订单已发货,不可取消") - 错误码建议采用「模块前缀_序号」格式,全局唯一且可读性强
- 可配合枚举类集中管理(如
OrderErrorCode.ORDER_007),避免硬编码
全局异常处理器适配分层响应
用 @ControllerAdvice 统一捕获,按异常类型返回不同 HTTP 状态码或响应体:
- 对
UserException子类,返回400 Bad Request或404 Not Found - 对
PaymentException子类,可能返回422 Unprocessable Entity(业务校验失败)或503 Service Unavailable(第三方支付不可用) - 避免所有异常都返回
500 Internal Server Error,掩盖真实问题性质
不复杂但容易忽略的是:异常类本身要轻量,只承载必要信息;真正复杂的错误上下文(如请求参数、调用链路)应由日志系统记录,而非塞进异常对象里。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










