12

我有一个要求,即使在引发异常后,程序执行流程也应该继续。

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

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

4

5 回答 5

19

首先,

有 2 种类型的异常。选中和未选中。

未经检查的异常是您的程序无法从中恢复的异常。像 NullPointers 一样,告诉你你的逻辑确实有问题。

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

因此,您应该避免使用寻找“异常”基类的 catch 语句。这两个时间都代表。您可能应该考虑寻找特定的异常(通常是运行时异常的子类)。

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

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

现在,考虑到您的代码:

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

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

于 2012-05-02T11:55:13.940 回答
12

如果您没有在 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");
   }
}

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

于 2012-05-02T11:43:03.293 回答
2

如果在for(DataSource source : dataSources)while 调用dataSources初始化迭代器时发生异常,则不会捕获该异常。

这就是您所说的“如果在第一次迭代中引发异常,则流程执行将停止。 ”?

如果是这种情况,那么您无能为力,并且循环不应执行任何交互。

于 2012-05-02T19:55:43.197 回答
1

你现在的逻辑就是这样做的。如果异常DataSource进入无效状态,下一次使用迭代器的尝试可能会抛出不同的异常,但这是另一回事,并且是特定的DataSource(所以你必须看看是否DataSource允许你做一些事情来处理那个其他的某种方式的无效状态)。但在一般情况下,你做对了。

于 2012-05-02T11:44:24.557 回答
-1

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

于 2012-05-02T11:43:01.920 回答