Создайте новое исключение и немедленно поймайте его, чтобы избежать повторения кода. Возможный?

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

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 и поймать это немедленно в блоке улова.

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

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 ответа

Решение

IllegalArgumentException является исключением во время выполнения.
Таким образом, компилятор не ограничивает вас в этом.
Я бы добавил, что ExecutionExceptioncatch Заявление также не поможет IllegalArgumentException бросать:

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);

}

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

  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);
      }

  }

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

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

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

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

Другие вопросы по тегам