当前位置: 首页 > 面试题库 >

“ try / catch”如何详细工作

刘松
2023-03-14
问题内容

我想了解try {} catch {}块和堆栈跟踪的工作原理。

我正在阅读这篇有关异常处理反模式的出色文章,发现以下段落:

catch (NoSuchMethodException e) {
  throw new MyServiceException("Blah: " +
      e.getMessage());
}

这破坏了原始异常的堆栈跟踪,并且总是错误的。

那之后,我意识到,我并不 真的 知道如何try/catch工作。我的理解如下。考虑示例:

void top() {
    try {
        f();
    } catch (MyException ex) {
        handleIt(); 
    } finally {
        cleanup();
    }
}

void f() {
    g();
}

void g() {
    throw new MyException();
}

当我调用时top(),调用链 在调用堆栈上top -> f -> g
留下两个堆栈帧(用于topf函数)。当在中引发异常时g,程序将使执行堆栈冒泡,直到找到try/catch处理该异常的块为止。同时,它释放了堆栈框架,并将堆栈跟踪信息附加到可以传递到的“魔术”对象上,catch并且可以打印堆栈跟踪。

如何知道try /
catch块“包围了”被调用函数?该信息是否绑定到堆栈框架?例如,指向错误处理块的指针(某些开关选择匹配的catch块)和指向finally块的指针?为什么e.getMessage()在上面的示例中具有破坏性(请参见注释)?

注意,我 知道 如何使用try / catch和异常,我想知道它如何 在内部 工作。


问题答案:

“它怎么知道被调用的函数被try / catch块“包围”?”

每个方法的代码都包含异常表,该异常表描述了该方法的所有try-
catch块。

当调用过程(函数,方法)时,当前堆栈帧会附加调用指令的地址,以便在正确的指令(调用指令之后)恢复该帧的执行。

当执行throw语句时,JVM
会检查每个堆栈框架
以了解该框架是否可以处理异常。如果它的方法包含一个try-
catch块,该块包含调用指令,并且它的异常类型是抛出的异常的超类型(或相同),则它可以。如果找到了这样的框架,则该框架将从try-
catch块指向的指令中恢复其执行。



 类似资料:
  • 主要内容:多重catch语句在实际应用中,对于错误的处理是极其重要的,任何程序都很难做到百分百完美,程序中可能存在大量未知问题,所以程序开发时一定要对各种问题进行相应的处理,而 Java 提供的异常处理机制可以帮用户更好地解决这方面的问题。Java 的异常处理机制可以让程序具有极好的容错性,让程序更加健壮。 Java 的异常处理通过 5 个关键字来实现: try、 catch、 throw、 throws 和 finally

  • 我似乎无法在代码中使用try catch。我对此很陌生,我必须使用它。我需要用户输入输入,然后我需要检查输入,可能是在一个循环中,是否有错误,以便被异常捕获。 -通过确保用户输入一个正整数表示英尺,输入一个非负十进制表示英寸,输入一个正十进制表示体重来执行输入验证。 -另外,将输入的值的范围限制为每个值的逻辑范围。例如,当输入以英尺为单位的高度时,一个相当合理的范围将包括4-7之间的值。以类似的方

  • 问题内容: 根据Java语言规范的第§14.20.2节 通过首先执行try块来执行带有finally块的try语句。然后有一个选择: 如果try块的执行正常完成,则执行finally块,然后可以选择: 如果finally块正常完成,则try语句正常完成。 如果finally块由于原因S突然完成,则try语句由于原因S突然完成 如果我正确地解释了它,那么在执行try块之后最终会被调用,但是所有这些如

  • 问题内容: 我知道这样做的对策。我想知道是否有一种不错且紧凑的方法来做到这一点。 问题答案: 图例-您的答案可能会有所改善;因为如果失败次数过多,就会吞下异常。好多了:

  • 问题内容: 我最初从大学开始编程,然后学习了vb.net。现在,我决定转向Java并进行一些查询。在vb中,try catch语句的布局如下 但是在Java网站(https://docs.oracle.com/javase/tutorial/essential/exceptions/putItTogether.html)中,我发现在Java中,您使用了两个陷阱,如下所示: 我希望有人能够解释为什么

  • 本文向大家介绍multi-catch和try-catch异常处理知识点详解,包括了multi-catch和try-catch异常处理知识点详解的使用技巧和注意事项,需要的朋友参考一下 multi-catch属于JDK1.7之后出现的,举例如下: 如果使用try-catch,会有多个catch块,从里到外是之类异常和父类异常,但是使用了multi-catch之后只需要有一个catch块就可以了,括号