抛出新异常并立即捕获以避免代码重复。可能的?
Throw new Exception and catch that immediately to avoid code repetition. Possible?
所以,基本上我有这种代码,其中重复发生:
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
行就不会在红色下划线...
我认为你应该在返回数据为空时抛出。但是,当您不打算或无法处理时,您也不应该捕获异常。
因此,如果您只是想记录错误并继续,请将 IllegalArgumentException
添加到现有的 catch 子句或添加另一个 catch 子句来处理此类异常。
要不然这里搞不定就让它传播。
此外,如果 IllegalArgumentException
被抛出,catch(ExecutionException){...}
将不会捕获它,因为
IllegalArgumentException
不是从 ExecutionException
派生的。
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++){
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
行就不会在红色下划线...
我认为你应该在返回数据为空时抛出。但是,当您不打算或无法处理时,您也不应该捕获异常。
因此,如果您只是想记录错误并继续,请将 IllegalArgumentException
添加到现有的 catch 子句或添加另一个 catch 子句来处理此类异常。
要不然这里搞不定就让它传播。
此外,如果 IllegalArgumentException
被抛出,catch(ExecutionException){...}
将不会捕获它,因为
IllegalArgumentException
不是从 ExecutionException
派生的。
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);
}