用自定义消息替换Java throw异常并继续

时间:2016-06-14 22:39:56

标签: java exception try-catch throw

我的Java for loop检查id中的不同ids() String[] array为:

BackTest.java

.....
    for (String id: ids()) {
         //..do something
         addResult(result(id));
    }

其中addResult()将结果添加到某个Java map。如果id does not exist,即http status!=200,那么我将抛出一个新的异常,如下面的代码段所示:

Api.Java

......
     if (status != 200) {
                    String error = "No additional error message received";
                    if (result != null && result instanceof JSONObject) {
                        JSONObject obj = (JSONObject) result;
                        if (obj.containsKey("error")) {
                            error = '"' + (String) obj.get("error") + '"';
                        }
                    }

                    throw new ApiException(
                            "API returned HTTP " + status +
                            "(" + error + ")"
                            );
       }

现在在我的第一个for循环中,如果循环中的第一个id does not exist,那么我抛出一个异常,这会使my entire process to fail无法检查{{ 1}}。我如何确保即使它在数组中的第一个id失败,代码应该继续检查更多的ID?

我可以考虑用try-catch块替换further ids as a part of id array。一个例子就是好的。

2 个答案:

答案 0 :(得分:2)

您可以像这样处理异常;

for(String id : ids()) {
    try {
        addResult(result(id));
    } catch(ApiException e) {
        System.err.println("Oops, something went wrong for ID "+id+"! Here's the stack trace:");
        e.printStackTrace();
    }
}

这将捕获异常,阻止它传播超过此点并因此结束循环,它将打印消息和堆栈跟踪。

答案 1 :(得分:0)

如果您想继续处理列表/数组的其余部分而不会产生新的异常,那么我会考虑使用continue关键字。

continue关键字专为此类情况而设计。它会导致程序执行立即返回到最近循环的开始并测试其状态。我建议使用以下设置。

    for(String id : ids()) {

        //do stuff...

        if(status != 200) {
            //write to data logger, etc...
            continue;
        }

        addResult(result(id));
    }

有些人不喜欢使用continue,因为其中太多可能会产生混乱的代码。但是,如果谨慎使用,它们可以帮助减少循环中的代码量。