Добавьте новое исключение и немедленно поймайте его, чтобы избежать повторения кода.Возможный? - PullRequest
0 голосов
/ 19 мая 2018

Итак, в основном у меня есть такой код, где происходит повторение:

for (int i = 0; i < dataFromApi.size(); i++){

        try {
            returnedPoolData = dataFromApi.get(i).get();

            if(returnedPoolData == null || returnedPoolData.getJsonString().isEmpty())
                this.processAndStoreData(returnedPoolData, i, calledApis, id, true);
            else
                this.processAndStoreData(returnedPoolData, i, calledApis, id, false);

        } catch (ExecutionException e){
            log.info("" + e);
            this.processAndStoreData(returnedPoolData, i, calledApis, id, true);
        }
    }

Я бы хотел избежать повторения, бросая IllegalArgumentException и перехватывая его немедленно в блоке catch.

Таким образом, код будет выглядеть так:

for (int i = 0; i < dataFromApi.size(); i++){

        try {
            returnedPoolData = dataFromApi.get(i).get();

            if(returnedPoolData == null || returnedPoolData.getJsonString().isEmpty())
                throw new IllegalArgumentException("Returned data was empty.");
            else
                this.processAndStoreData(returnedPoolData, i, calledApis, id, false);

        } catch (ExecutionException e){
            log.info("" + e);
            this.processAndStoreData(returnedPoolData, i, calledApis, id, true);
        }
    }

Будет ли это работать?Потому что, как только я уберу ExecutionException, строка throw new не будет подчеркнута красным ...

Ответы [ 3 ]

0 голосов
/ 19 мая 2018

IllegalArgumentException является исключением во время выполнения.
Таким образом, компилятор не ограничивает вас обработкой.
Я бы добавил, что оператор ExecutionException catch также не будет полезен для обработки IllegalArgumentException throwing:

catch (ExecutionException e){
    log.info("" + e);
    this.processAndStoreData(returnedPoolData, i, calledApis, id, true);
}

, поскольку IllegalArgumentException не является подклассом ExecutionException.
Чтобы перехватить оба исключения, вы можете написать оператор catch, такой как:

catch (ExecutionException | IllegalArgumentException e){
   ...
}

Помимо способа правильного перехвата исключения, я бы добавил, что создание исключения для перехвата его одним и тем же методом не обязательно является хорошим использованием исключений.
Альтернативный способ избежать вызова из трех дубликатовиспользует логическое значение, такое как:

for (int i = 0; i < dataFromApi.size(); i++) {

    boolean isErrorCase = false;

    try {
        returnedPoolData = dataFromApi.get(i).get();

        if (returnedPoolData == null || returnedPoolData.getJsonString().isEmpty()) {              
            isErrorCase = true;
        }

    } catch (ExecutionException e) {
        log.info("" + e);
        isErrorCase = true;
    }

    this.processAndStoreData(returnedPoolData, i, calledApis, id, isErrorCase);

}
0 голосов
/ 19 мая 2018

Вы можете использовать

  for (int i = 0; i < dataFromApi.size(); i++){
      returnedPoolData = null;
      try {          
          returnedPoolData = dataFromApi.get(i).get();
      } catch (ExecutionException e){
          log.info("err:", e);
      }

      if(returnedPoolData == null || returnedPoolData.getJsonString().isEmpty()) {
        this.processAndStoreData(returnedPoolData, i, calledApis, id, true);
      }
      else {
        this.processAndStoreData(returnedPoolData, i, calledApis, id, false);
      }

  }
0 голосов
/ 19 мая 2018

Я думаю, вы должны выбросить, когда возвращаемые данные равны нулю.Но вам также не следует перехватывать исключение, если вы не собираетесь или не можете его обработать.

Так что, если вы просто хотите зарегистрировать ошибку и продолжить, добавьте IllegalArgumentException в существующее предложение catch или добавьтедругое предложение catch для обработки такого рода исключений.

В противном случае, если вы не можете справиться с этим здесь, пусть распространяется .

Также, если выброшено IllegalArgumentException, catch(ExecutionException){...} не поймает его, так как IllegalArgumentException не снимается с ExecutionException.

...