stockinsufficientexception 是继承 runtimeexception 的库存不足异常,含 productid 和 availablestock 字段,提供双参/单参构造器、可读性 getmessage() 及 getter 方法,支持精准定位缺货商品并便于日志与监控。

设计一个带商品 ID 的库存不足异常,核心是让调用方能快速定位哪个商品缺货,同时保持异常语义清晰、可读性强、便于日志记录和后续处理。
定义 StockInsufficientException 类
继承 RuntimeException(业务异常通常不强制捕获),提供含商品 ID 和当前库存的构造器,重写 getMessage() 增强可读性:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public class StockInsufficientException extends RuntimeException {
private final Long productId;
private final int availableStock;
public StockInsufficientException(Long productId, int availableStock) {
super(String.format("商品ID %d 库存不足:当前可用库存 %d", productId, availableStock));
this.productId = productId;
this.availableStock = availableStock;
}
// 可选:提供仅含 productId 的简化构造(如默认库存为 0)
public StockInsufficientException(Long productId) {
this(productId, 0);
}
// 提供 getter,方便上层提取信息(比如记录到监控或补偿逻辑)
public Long getProductId() {
return productId;
}
public int getAvailableStock() {
return availableStock;
}
}
在业务逻辑中合理抛出
不要只在扣减前做“if (stock
- 在扣减库存前,查出当前可用库存(如通过 SELECT ... FOR UPDATE)
- 判断是否足够;若不足,立即 new 并 throw 新异常,传入查到的 productId 和 availableStock
- 避免在 catch 块里“包装”其他异常再抛出——除非你明确要转换语义(例如把 SQLException 转为业务异常)
配合日志与监控更有效
异常本身只是信号,真正价值在于如何被消费:
- 全局异常处理器(如 Spring 的 @ControllerAdvice)捕获该异常时,记录结构化日志,包含 productId、订单号(如有)、时间戳
- 可将 productId 上报至监控系统(如 Prometheus + AlertManager),设置“1 小时内同商品触发超 X 次”告警
- 前端或调用方收到该异常响应后,可精准提示“商品 XXX 暂时缺货”,而不是笼统的“下单失败”
进阶考虑:支持多商品场景
如果一次下单涉及多个商品,且需返回全部缺货项,可扩展为:
- 新增 StockInsufficientBatchException,内部持 List
- InsufficientItem 包含 productId、required、available 字段
- 主异常 getMessage 返回汇总信息(如“共 2 个商品库存不足:商品 1001(需 2,剩 0)、商品 1005(需 1,剩 0)”)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










