Сонар Показывает проблему, если я использовал оператор «instanceof» в блоке catch

#java #try-catch

Вопрос:

Как я могу выполнить рефакторинг ниже блока catch, в котором я использую код java11

 public String methodName(ClassRequest request, Destination ABC) {
        try {
          <Some Code Here>
        } catch (Exception e) {
            log.error("error", ABC, e);
            if(e instanceof ABCRestException ||
                    (ABC == PREM amp;amp; (e instanceof HttpServerErrorException || e instanceof HttpClientErrorException))) {
                throw e;
            } else if(e instanceof HttpServerErrorException) {
                throw new ABCRestException(request.getAId(), "unexpected_error", "Some Message", e, INTERNAL_SERVER_ERROR);
            } else if(e instanceof HttpClientErrorException) {
                throw new ABCRestException(request.getAId(), "missing_field", "Some Message", e, BAD_REQUEST);
            } else {
                throw new ABCRestException(request.getAId(), "unexpected_error", "Some Massage", e, INTERNAL_SERVER_ERROR);
            }
        }
    }
 

Как я могу провести рефакторинг этого кода, означает блокировку

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

1. добавьте отдельные блоки улавливания

2. Могу ли я определить один блок catch? и объявите все исключения внутри блока catch

3. @PallaviSingh это неправильный способ, catch предназначен для конкретных исключений, поэтому вам не нужно использовать в

4. @PallaviSingh, что вы можете сделать, это вызвать метод внутри блока catch, передающий исключение, и запустить там некоторую общую логику

5. @PallaviSingh да, и именно поэтому он жалуется

Ответ №1:

вам просто нужно два таких блока улова, как этот

 public String methodName(ClassRequest request, Destination ABC) {
        try {
          <Some Code Here>
        } catch (HttpServerErrorException e) {
            log.error("error", ABC, e);
            
            if (ABC == PREM){
             throw e;
            }else{
              throw new ABCRestException(request.getAId(), "unexpected_error", "Some Message", e, INTERNAL_SERVER_ERROR);
            }
        } catch (HttpClientErrorException e){
            if (ABC == PREM){
             throw e;
            }else{
               throw new ABCRestException(request.getAId(), "missing_field", "Some Message", e, BAD_REQUEST);
            }
        }
    }
 

Если вы хотите повторно использовать некоторую логику, вы можете написать закрытый метод и вызвать его внутри блока catch

Если два или более исключений имеют одну и ту же точную логику, вы также можете использовать мульти-улов, который будет улавливать различные исключения в одном блоке

 try{
   codeGoesVroomVroomAndThrows()
}catch(ExceptionA | ExceptionB e){
  //do something
}