场景:保存记录时,若记录存在,那么抛出异常。
一般在插入之前会查询记录是否存在,但是有概率该线程在保存记录时,该记录已经被其他线程保存。所以一般可以在某些字段上建立“唯一索引”。
建立唯一索引后,直接去保存数据,若抛出异常,那么获取到异常信息,判断是否是主键(唯一键)冲突的异常。
主键冲突异常.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;
}
}
捕获到特定的异常后,转换为个性化异常。否则继续对外抛出异常。
网友评论