抛异常的正确姿势
前言:最近跟着网上做一个项目,发现一个抛异常的写法特别有意思,而且除了用于抛异常也可以做一些状态的存储非常方便,所以这记录分享给大家参考(强烈欢迎大佬提出更优秀的写法)
一、创建一个枚举类
首先定义一个用于记录异常信息的枚举类,这么做的好处是,让代码更加简洁易懂省去重复代码
当然枚举本身有很多优势,例如:
- 使用枚举会有更强的参数约束,在编译时期就能帮我们检查参数是否正确
- 不会被反射破坏
- 单例实现
枚举类
@Getter //Lombok插件:可省略getter方法
public enum ResultEnum {
PRODUCT_NOT_FOUND(10,"商品不存在"),
PRODUCT_STOCK_ERROR(11,"商品库存不足"),
;
private Integer code;
private String message;
ResultEnum(Integer code,String message){
this.code=code;
this.message=message;
}
}
二、自定义异常
通过自定义异常的构造方法传入枚举类对象
自定义异常类
public class SellException extends RuntimeException{
private Integer code;
public SellException(ResultEnum resultEnum) {
super(resultEnum.getMessage());
this.code = resultEnum.getCode();
}
}
三、实际运用演示(Service层)
service层
以下代码主要实现减库存功能,传入用户所有订单(cartDTOList),在校验库存之后,循环判断每件商品,并减去每件商品的数量,然后给库存重新赋值
@Override
@Transactional
public void decreaseStock(List<CartDTO> cartDTOList) {
for (CartDTO cartDTO:cartDTOList){
ProductInfo productInfo = repository.findOne(cartDTO.getProductId());
if (productInfo == null){
// 自定义异常
throw new SellException(ResultEnum.PRODUCT_NOT_FOUND);
}
Integer result = productInfo.getProductStock() - cartDTO.getProductQuantity();
if (result < 0 ){
// 自定义异常
throw new SellException(ResultEnum.PRODUCT_STOCK_ERROR);
}
productInfo.setProductStock(result);
repository.save(productInfo);
}
}

浙公网安备 33010602011771号