java - 通过嵌套循环/调用的异常传播

标签 java exception try-catch while-loop continue

我无法理解异常应该如何传播。当 doSomething() 抛出异常时,我的代码(与下面的通用代码非常相似)执行 otherCode() 并且无法continue outer。我需要循环解析一堆文件,其中一些文件可能格式不正确(导致异常),然后循环解析数据,这也可能导致异常(例如文件格式正确但缺少字段) .当这些异常发生时,循环应该在其余的字段/文件上继续。
我的困惑/不确定点由下面评论中的问题(用?)表示。

...
public static void main(string[] args) {
   outer: while ( thingsToDo ) {
       try{
           someItrType someIterable = doSomething(); // might throw
           otherCode();  // only do this if nothing was thrown above?
       } catch (SomeExceptionType e) {
           handleSomeExceptionType();
           continue outer; // keep trying the rest of the loop?
       }
       otherOtherCode(): // only if nothing thrown, because of the continue?
       inner: while( someIterable.next() ) {
            try{
                doSomethingElse();  // might throw
            } catch (SomeExceptionType e) {
                handleSomeExceptionType();
                continue inner; // keep trying the inner loop?
            }
            doThisIfAllOkay();  // only if no exceptions thrown?
        }
    }
}

我也不理解通过嵌套调用的传播,例如如果 doSomething() 调用 nextMethod(),后者又调用 nextNextMethod() 并且其中任何一个抛出异常,那么执行何时会捕获这些异常方法与 doSomething() 周围的 try-catch block 中的方法对比?例如,如果这些方法 throw new,包含 try-catch 或没有处理...

最佳答案

当 try block 中发生异常时,它会立即导致程序流移动到 catch block 。 try block 中发生异常后的任何代码都不会执行。

使用 continue 关键字会使循环从循环顶部开始跳到下一次迭代,因此 catch block 下面的任何代码都不会执行。

就嵌套函数而言:
异常处理有 2 个选项。要么你自己处理它,要么你声明你的函数可以抛出异常(特定类型)。假设程序中的每个函数都声明它throws Exception,那么异常将从您的所有代码中冒出,一直传到 Java 虚拟机,然后终止。基本上,带有异常的嵌套函数会一直将其向上传递到堆栈,直到它在 try/catch block 中被处理。

关于java - 通过嵌套循环/调用的异常传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4029349/

相关文章:

java - 在 hibernate 中执行唯一 ID 的最聪明方法

java - 在 Spring 3 中禁用架构验证

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

php - 如何使用PHP中的严格报告管理错误?

php - 如何正确使用 Try-Catch Exception?

Java:何时使用字段与参数?

java - 有没有办法从 DefaultHandler 中停止或退出解析?

java - "javax.swing.JPanel cannot be cast"异常,令人困惑

c# - 抛出 Win32Exception

java - 将 RuntimeException 作为异常重新抛出