Лучший способ обработки исключения — spring-boot

#spring #spring-boot #exception

#spring #spring-boot #исключение

Вопрос:

У меня есть около десяти API, которые взаимодействуют с redis для хранения данных.

В настоящее время он генерирует вложенное исключение, поэтому я сделал, как показано ниже, для обработки вложенного исключения.

     @Override 
    public boolean delMyStatus(String key) {
        try{
            return  redisTemplate.delete(key);
        }
        catch (Exception e){
            if(e.getCause() != null amp;amp; 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;
    }
  

Но я не хочу делать это для всех API redis dao, есть ли лучший способ обработки исключения.

Комментарии:

1. catch (RedisException e){} ?

2. catch (RedisException e){ log.error («RedisException» ex.GetMessage()); } catch (Exception e){ log.error («Exception » ex.GetMessage()); } Это всегда приводит к блокировке исключения

Ответ №1:

Вы можете использовать @RestControllerAdvice . Создайте пользовательский класс исключений, CustomRedisException выбрасывающий CustomRedisException исключение из каждого контроллера, и обрабатывайте это отдельно, class аннотируясь с помощью @RestControllerAdvice .

 @Override 
public boolean delMyStatus(String key) {
    try{
        return  redisTemplate.delete(key);
    }
    catch (Exception e){
        if(e.getCause() != null amp;amp; 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. На самом деле я не хочу возвращать эту ошибку в rest-controller, это было для какой-то внутренней операции, поэтому я хочу обработать эту ошибку внутренне и выполнить некоторые действия на основе этого

2. В этом случае вы можете создать общий метод для обработки исключения и вызывать его из каждого блока catch.

Ответ №2:

Вы можете достичь этого с помощью аспектов и @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
     }

}
  

Комментарии:

1. В этом я хочу зарегистрировать некоторый параметр, отправленный вызывающим абонентом. Итак, как отправить пользовательский параметр вместе с исключением в функцию @AfterThrowing