我有一个要求,即在抛出异常后,程序执行流程仍应继续。
for(DataSource source : dataSources) {
try {
//do something with 'source'
} catch (Exception e) {
}
}
如果在第一次迭代中抛出异常,则停止流程执行。我的要求是在第一次迭代抛出异常之后,其他迭代应该继续。 我可以在catch块中编写逻辑吗?
答案 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
构造。