gpt4 book ai didi

java - `try/catch`具体是怎么工作的

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:41:55 26 4
gpt4 key购买 nike

我想深入了解 try {} catch {} block 和堆栈跟踪是如何工作的。

我正在阅读 this great article about exception handling anti-patterns并找到以下段落:

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

This destroys the stack trace of the original exception, and is always wrong.

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

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

void f() {
g();
}

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

当我调用 top() 时,调用链 top -> f -> g叶两 stack frames在调用堆栈上(对于 topf 函数)。当在g中抛出异常时,程序在执行堆栈中冒泡,直到找到处理异常的 try/catch block 。同时,它释放堆栈帧并将堆栈跟踪信息附加到一些可以传递给 catch 的“魔法”对象,然后可以打印堆栈跟踪。

它如何知道被调用的函数被 try/catch block “包围”了?此信息是否绑定(bind)到堆栈帧?比如,指向错误处理 block 的指针(某些开关选择匹配的 catch block ),以及指向 finally block 的指针?为什么 e.getMessage() 在上面的例子中是破坏性的(见评论)?

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

最佳答案

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

每个方法的代码包含Exception Table它描述了该方法的所有 try-catch block 。

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

执行 throw 语句时,JVM examines each stack frame找出该框架是否可以处理异常。如果它的方法包含一个包含调用指令的 try-catch block ,并且 block 的异常类型是抛出异常的父类(super class)型(或相同),则它可以。如果找到这样的帧,则该帧从 try-catch block 指向的指令恢复执行。

关于java - `try/catch`具体是怎么工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19765400/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com