一、异常处理方式:
1.try-catch语句处理异常,try中的代码执行到异常停止,之外的代码依次会继续执行。
2.如果没有try-catch语句进行异常处理,则由JVM自行处理异常,那么程序会停止到异常处,不会执行后续的代码。
二、自定义异常

自定义异常继承Exception还是RuntimeException?
Exception:在程序中必须使用try...catch进行处理。
RuntimeException:可以不使用try...catch进行处理,但是如果有异常产生,则异常将由JVM进行处理,就是程序运行的时候会报错。
Exception 的范围更大些,通常我们遇见的都是运行时异常即RuntimeException,RuntimeException可回滚
实例
自定义异常
public class GoodsException extends Exception implements Serializable {
private static final long serialVersionUID = -2558576087161244731L;
private Integer code;
public GoodsException(String message, Integer code) {
super(message);
this.code = code;
}
public Integer getCode() {
return code;
}
}
调用
for (Map.Entry<String, List<GoodsSkuServiceDTO>> i : inputNameMap.entrySet()) {
String key = i.getKey();
List<GoodsSkuServiceDTO> value = i.getValue();
//该商户下新增相同套餐记录大于一条则抛出异常
if (value.size() > 1) {
log.info("新增,商户:{}套餐:{}重复添加", k, key);
throw new GoodsException(StringUtils.join("第" + value.get(0).getLineNumber() + "行" +
ExceptionEnum.SKU_REPEAT.getDesc()), ExceptionEnum.SKU_REPEAT.getCode());
}
}
这里需要注意遍历里抛异常循环需要用for,foreach会报错,如果异常不是try...catch...那么每层都要把异常抛出(如:
public Integer addGoodSkuList(List<do> goodsDtoList) throws GoodsException
)
异常通常涉及到回滚,可以在类上添加注解(@Transactional(rollbackFor = Exception.class
)
回滚的意思是如果有异常抛出会返回到堆栈的初始化状态
@Override
@Transactional(rollbackFor = Exception.class)
public NewOrderBO addOrderByCronjob(String transactionId) throws OrderException{
OrderSubscriptionInfoDO orderSubscriptionInfoDO = orderSubscriptionInfoMapper.selectByTransactionId(transactionId);
if (Objects.isNull(orderSubscriptionInfoDO)){
throw new OrderException(ExceptionDescEnum.SIGN_NOT_EXIST.getDesc(),ExceptionDescEnum.SIGN_NOT_EXIST.getCode());
}
参考链接:
1、详解
网友评论