抛异常的正确姿势

前言:最近跟着网上做一个项目,发现一个抛异常的写法特别有意思,而且除了用于抛异常也可以做一些状态的存储非常方便,所以这记录分享给大家参考(强烈欢迎大佬提出更优秀的写法)


一、创建一个枚举类

首先定义一个用于记录异常信息的枚举类,这么做的好处是,让代码更加简洁易懂省去重复代码

当然枚举本身有很多优势,例如:

  • 使用枚举会有更强的参数约束,在编译时期就能帮我们检查参数是否正确
  • 不会被反射破坏
  • 单例实现

枚举类

@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);
    }
}
posted @ 2020-04-25 18:06  guaosky  阅读(618)  评论(0)    收藏  举报