抛出新异常并立即捕获以避免代码重复。可能的?

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

这样行吗?因为一旦我删除 ExecutionExceptionthrow 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);

}