我想向try {} catch {}
块和堆栈跟踪如何工作的内部工作。`try/catch`如何在细节中工作
我读this great article about exception handling anti-patterns,发现以下段落:
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
留下了两个stack frames调用堆栈上(对于top
和f
功能)。当在g
, 中引发异常时,程序会启动执行堆栈,直到找到处理异常的try/catch
块为止。同时它释放堆栈帧并将堆栈跟踪信息附加到一些可以传递到catch
的“魔术”对象,并且可以打印堆栈跟踪。
它如何知道被调用的函数被try/catch块“包围”?这个信息绑定到堆栈帧吗?就像一个指向错误处理块的指针(某些开关选择一个匹配的块catch
)和一个指向finally
块的指针?为什么e.getMessage()
在上述示例中具有破坏性(请参阅评论)?
注意,我知道如何使用try/catch语句和例外情况,我想知道它是如何工作内。
嗯,你说得对,我没有注意到'throw' :)但剩余的问题仍然有效 –