更好的处理异常的方法是spring-boot
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更好的处理异常的方法是spring-boot相关的知识,希望对你有一定的参考价值。
我有一些Ten API与redis对话以存储数据。
目前它正在抛出嵌套异常,所以我在下面做了如下处理嵌套异常。
@Override
public boolean delMyStatus(String key) {
try{
return redisTemplate.delete(key);
}
catch (Exception e){
if(e.getCause() != null && e.getCause().getCause() instanceof RedisException) {
RedisException ex = (RedisException)e.getCause().getCause();
log.error("RedisException " + ex.getMessage());
/* Do some action*/
} else {
throw new IllegalStateException("...");
}
}
return false;
}
但我不想为redis dao的所有APIS做这个,有没有更好的方法来处理异常。
答案
你可以使用@RestControllerAdvice
。制作一个自定义异常类CustomRedisException
throw CustomRedisException
来自每个控制器的异常,并在用class
注释的单独@RestControllerAdvice
中处理它。
@Override
public boolean delMyStatus(String key) {
try{
return redisTemplate.delete(key);
}
catch (Exception e){
if(e.getCause() != null && e.getCause().getCause() instanceof RedisException) { RedisException ex = (RedisException)e.getCause().getCause();
throw new CustomRedisException(ex);
} else {
throw new IllegalStateException("...");
}
}
return false;
}
使GlobalExceptionHandler如下所示。
@RestControllerAdvice(basePackages = "your base package here", basePackageClasses = RepositoryRestExceptionHandler.class)
public class GlobalRestExceptionHandler {
@ExceptionHandler
public ResponseEntity<ErrorResponse> handleCustomException(final CustomRedisExceptionex) {
// code for exception handling here.
return new ResponseEntity<>(
new ErrorResponse(HttpStatus.PRECONDITION_FAILED.value(), ex.getMessage()),
HttpStatus.PRECONDITION_FAILED);
}
}
另一答案
您可以使用aspect和@AfterThrowing
注释来实现它。
首先确保允许Spring在任何配置类上使用@EnableAspectJAutoProxy
注释使用方面。
然后使用@Aspect
注释的方法定义一个@AfterThrowing
类,如下所示:
@Aspect
public class GenericExceptionHandler {
// you can use more specific path here
@AfterThrowing ("execution(* *.*(..))", throwing = "ex")
public void handleException(Exception ex) throws Exception {
// handle the exception here
}
}
以上是关于更好的处理异常的方法是spring-boot的主要内容,如果未能解决你的问题,请参考以下文章