我有一个要求,即使在引发异常后,程序执行流程也应该继续。
for(DataSource source : dataSources) {
try {
//do something with 'source'
} catch (Exception e) {
}
}
如果在第一次迭代中抛出异常,流程执行将停止。我的要求是即使在第一次迭代抛出异常之后,其他迭代也应该继续。我可以在 catch 块中编写逻辑吗?
我有一个要求,即使在引发异常后,程序执行流程也应该继续。
for(DataSource source : dataSources) {
try {
//do something with 'source'
} catch (Exception e) {
}
}
如果在第一次迭代中抛出异常,流程执行将停止。我的要求是即使在第一次迭代抛出异常之后,其他迭代也应该继续。我可以在 catch 块中编写逻辑吗?
首先,
有 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
无论如何,希望这会有所帮助。
如果您没有在 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");
}
}
您将看到所有迭代都执行,即使每个迭代都抛出异常。
如果在for(DataSource source : dataSources)
while 调用dataSources
初始化迭代器时发生异常,则不会捕获该异常。
这就是您所说的“如果在第一次迭代中引发异常,则流程执行将停止。 ”?
如果是这种情况,那么您无能为力,并且循环不应执行任何交互。
你现在的逻辑就是这样做的。如果异常DataSource
进入无效状态,下一次使用迭代器的尝试可能会抛出不同的异常,但这是另一回事,并且是特定的DataSource
(所以你必须看看是否DataSource
允许你做一些事情来处理那个其他的某种方式的无效状态)。但在一般情况下,你做对了。
不,没有语言支持处理异常然后跳回到导致它的语句。try...catch
即使前一个子序列引发异常,您也必须围绕应该执行的每个操作子序列包装单独的构造。