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

时间:2018-05-19 11:34:34

标签: java exception exception-handling repeat

所以,基本上我有这种代码,重复发生:

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

那会有用吗?因为我删除ExecutionExceptionthrow new行没有以红色下划线...

3 个答案:

答案 0 :(得分:1)

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

}

答案 1 :(得分:0)

我认为你应该在返回的数据为null时抛出。但是当你不打算或不能处理它时,你也不应该捕获异常。

因此,如果您只是想记录错误并继续向现有的catch子句添加IllegalArgumentException或添加另一个catch子句来处理此类异常。

否则,如果您无法在此处理,请将其传播

如果抛出IllegalArgumentExceptioncatch(ExecutionException){...}将无法捕获它,因为  IllegalArgumentException不会ExecutionException

答案 2 :(得分:0)

您可以使用

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

  }