3

首先,在我被骂之前,我想澄清一点:我没有计划编写任何会使用这种控制流的代码;它显然很糟糕。忘记一个用例,这更像是一个关于它是否可能的问题:

我想知道是否有可能知道调用堆栈的某个地方是否正在为特定异常在 catch 块中调用函数。

假设我有一个功能:

foo() {
try {
    something
}
catch (SuperException s) {
    bar()
}

因此,如果无法控制 bar 的方法签名,并且给定的 bar 也被许多其他函数调用,那么如果在 catch 块中调用捕获超级异常, bar 的行为会有所不同吗?(不,被 foo 调用不是充分条件,它是最重要的超级例外)

4

1 回答 1

6

您可以查看调用堆栈并获取每个调用的行号。

您可以读取字节码以确定 catch 块的位置以及这些块中的哪些代码行。

将两者匹配在一起以查看调用堆栈中的任何位置是否位于 catch 块中。

注意:这仅在您的代码中编译了调试信息时才有效。

于 2012-06-14T15:50:59.373 回答