mybatis (5)—唯一索引冲突后抛出个性化异常

2020-06-18  本文已影响0人  小胖学编程

场景:保存记录时,若记录存在,那么抛出异常。

一般在插入之前会查询记录是否存在,但是有概率该线程在保存记录时,该记录已经被其他线程保存。所以一般可以在某些字段上建立“唯一索引”。

建立唯一索引后,直接去保存数据,若抛出异常,那么获取到异常信息,判断是否是主键(唯一键)冲突的异常。

数据库唯一索引(主键)出现冲突时,便会抛出:

主键冲突异常.png

代码实现

异常工具类:

/**
 * 异常工具类
 */
public abstract class ExceptionUtil {

    //主键/唯一键冲突的异常信息
    public static final String UNIQUE_ERROR = "Duplicate entry";

    /**
     * 获取到错误描述
     */
    public static String getErrorCode(Exception e) {
        String errorCode = "";
        if (e.getCause() != null && e.getCause().getMessage() != null) {
            errorCode = e.getCause().getMessage();
        }
        if (Strings.isNullOrEmpty(errorCode) && e.getMessage() != null) {
            errorCode = e.getMessage();
        }
        return errorCode;
    }
}
    @Override
    public void save(PrizePo prizePo) {
        try {
            prizeDao.save(prizePo);
        } catch (Exception e) {
            String errorCode = ExceptionUtil.getErrorCode(e);
            if (errorCode.contains(ExceptionUtil.UNIQUE_ERROR)) {
                throw new HomeworkException("奖品名称已存在,请调整奖品名称");
            }
            //否则的话,继续向外部抛出异常!
            throw e;
        }
    }

捕获到特定的异常后,转换为个性化异常。否则继续对外抛出异常。

上一篇下一篇

猜你喜欢

热点阅读