更好的处理异常的方法是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的主要内容,如果未能解决你的问题,请参考以下文章

以功能方式处理异常的更好方法

求助,spring-boot升级带来的异常

spring-boot实战07:Spring Boot中Web应用的统一异常处理

测试开发专题:spring-boot自定义异常返回

测试开发专题:spring-boot自定义异常返回

在春季批处理(spring-boot-1.5.2.RELEASE)中使用多个数据源在启动时引发异常