如何在抛出异常后继续执行程序?

时间:2012-05-02 11:40:48

标签: java

我有一个要求,即在抛出异常后,程序执行流程仍应继续。

for(DataSource source : dataSources) {
    try {
        //do something with 'source'
    } catch (Exception e) {
    }
}

如果在第一次迭代中抛出异常,则停止流程执行。我的要求是在第一次迭代抛出异常之后,其他迭代应该继续。 我可以在catch块中编写逻辑吗?

5 个答案:

答案 0 :(得分:11)

首先,

有两种类型的例外。检查&未选中状态。

未经检查的例外是您的程序无法恢复的例外情况。就像NullPointers一样,告诉你你的逻辑确实存在问题。

已检查的异常是运行时异常,您可以从这些异常中恢复。

因此,您应该避免使用catch statemens查找“Exception”基类。这代表了两次。您应该考虑寻找特定的异常(通常是运行时异常的子类)。

简而言之,还有更多内容。

您还应该记住,不应将异常处理用作工作流程。通常表明您的架构有点不足。正如名称所述,它们应被视为正常执行的“例外”。

现在,考虑一下代码:

for(DataSource source : dataSources) {
    try {
        //do something with 'source'
    } catch (Exception e) { // catch any exception
      continue; // will just skip this iteration and jump to the next
    }
   //other stuff ? 
}

实际上,它应该捕获异常并继续前进。也许你有什么不告诉我们的? :P

无论如何,希望这会有所帮助。

答案 1 :(得分:8)

如果你没有在catch块中以某种方式破坏循环,那么其他迭代将继续,无论是否在前一次迭代中抛出异常。

试试这个简单的例子,看看会发生什么:

List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");

for(String str: list) {
   try {
       System.out.println(str);
       throw new Exception("Exception for string " + str);
   } catch(Exception ex) {
       System.out.println("Caught exception");
   }
}

您将看到所有迭代都会执行,即使每个迭代都会抛出异常。

答案 2 :(得分:1)

如果for(DataSource source : dataSources)在调用dataSources初始化迭代器时发生异常,则 异常

这是你的意思“如果在第一次迭代中抛出异常,则流程执行停止。”?

如果是这种情况,那么你就无法做其他任何事情而且循环应该执行任何交互。

答案 3 :(得分:0)

你现在拥有的逻辑确实如此。如果异常将DataSource置于无效状态,则下一次尝试使用迭代器可能会抛出一个不同的异常,但这是一个不同的问题,特定于DataSource(所以你必须看看是否DataSource允许您以某种方式处理其他无效状态。但在一般情况下,你做得对。

答案 4 :(得分:-3)

不,没有语言支持来处理异常,然后跳回到导致异常的语句。即使前一个子序列引发异常,您也必须围绕应该执行的每个操作子序列包装单独的try...catch构造。