Создайте новое исключение и немедленно поймайте его, чтобы избежать повторения кода. Возможный?
Итак, в основном у меня есть такой код, где происходит повторение:
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
является исключением во время выполнения.
Таким образом, компилятор не ограничивает вас в этом.
Я бы добавил, что ExecutionException
catch
Заявление также не поможет 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
,