自从第一次处理这个场景以来,要求知道哪种方法最好。
此处针对所有DataIntegrityViolationException
,发送相同的错误消息
@Override
public boolean saveParam(ParamDto dto) throws ParamException
{
try
{
return super.save(dto);
}
catch(DataIntegrityViolationException e)
{
throw new ParamException(ParamException.INTERNAL_SERVER_ERROR, messageSource.getMessage(CodeEnum.DUPLICATE_APP.getValue(), new Object[] { dto.getParamKey() }, Locale.ENGLISH));
}
catch (GenericException ge)
{
throw new ParamException(ge, ge.getRootCauseMessage());
}
}
我们如何为同一个例外提供不同的海关信息。我们需要检查消息字符串吗?
此处DataIntegrityViolationException
下有两种不同的例外。
"错误:类型字符(1)"值太长(id = 172)""
"错误:重复的键值违反了唯一约束" uk_param_key" \ n详细信息:键(param_key)=(Test1)已经存在。"
< / LI> 醇>
答案 0 :(得分:1)
正如您已经抓住DataIntegrityViolationException
异常使用getMostSpecificCause方法来获取异常的实际原因一样。
然后,您可以检查异常是否属于具有instanceof
关键字的特定类型,并相应地自定义您的消息。例如,MySQL JDBC驱动程序会针对不同类型的错误抛出MysqlDataTruncation
,MySQLIntegrityConstraintViolationException
等。检查文档以查看数据库驱动程序抛出的不同类型的异常。
此外,您可以检查异常消息并将其与预定义的消息进行比较,但这有点棘手且容易出错。