我有一个SpringBoot应用程序,该应用程序使用spring数据CrudRepository
来保留消息。
对于应用程序,重要的是在出现 DB服务器端异常时不要丢失消息。
例如数据库服务器无法访问或数据库实例面临内存问题等。
因此,我想特别处理它们,然后重试直到数据库服务器端问题解决为止
解决。
我碰到了这篇文章,其中解释了Spring JPA抛出的Exception
类
https://danielkvist.net/code/spring-data-crudrepository-exceptions
其中总结了Spring JPA的Exception
层次结构。因此,我遵循了Exception
处理逻辑。
saveMessages (List<Message> messages)
{
try {
crudRepo.saveAll(messages);
} catch (NonTransientDataAccessException | TransientDataAccessException e) {
// throw custom retryable exception for the service to retry
throw new CustomRetryableException(e);
}
}
在生产中执行代码时,上述逻辑失败,因为引发了各种异常。
例如当数据库服务器宕机CannotCreateTransactionException
时,或者在请求TransactionSystemException
之间重启数据库服务器时。
所以我想我错过了处理TransactionException
问题:
处理TransactionException
的子类的最佳方法是什么? (在开头我提到的上下文中)
除了DataAccessException
和TransactionException
之外,还有其他应处理的其他异常吗?
答案 0 :(得分:0)
您可以捕获异常的父类,但是如果您想在DAO /服务中捕获/处理异常,我只会捕获RuntimeException
try {
crudRepo.saveAll(messages);
} catch (RuntimeException e) {
// add log here!
throw new CustomRetryableException(e);
}
另一种方法是使用通用的ExceptionHandler
在单独的类中定义此逻辑(您也可以为不同的异常定义不同的处理程序)
@ExceptionHandler(RuntimeException.class)
public ResponseEntity<String> genericHandler(HttpServletRequest request, RuntimeException ex) {
更多信息和示例here