处理异常的更好方法是使用spring-boot

时间:2019-03-11 13:18:16

标签: spring spring-boot exception

我有一些十个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的所有API都这样做,有没有更好的方法来处理异常。

2 个答案:

答案 0 :(得分:3)

您可以使用@RestControllerAdvice。使每个控制器的自定义异常类CustomRedisException引发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);
    }
}

答案 1 :(得分:0)

您可以使用方面和@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
     }

}