嗯,轻率的答案是语言规范禁止它。
但让我们退后一步,换个角度想一想——如果你可以这样做呢?
try {
foo();
}
bar();
catch (Exception e) {
baz();
}
这可能是什么语义?如果我们在foo() 中捕获异常,是否会调用baz()? bar() 呢?如果bar() 抛出,我们会在这种情况下捕获异常吗?
如果bar() 中的异常没有被捕获,并且foo() 中的异常阻止bar() 运行,则该构造相当于:
try {
foo();
} catch (Exception e) {
baz();
}
bar();
如果bar() 中的异常被捕获,而foo() 中的异常阻止bar() 运行,则构造等效于:
try {
foo();
bar();
} catch (Exception e) {
baz();
}
如果bar() 中的异常没有被捕获,并且foo() 中的异常不阻止bar() 运行(bar() 总是被执行),那么构造相当于:
try {
foo();
} catch (Exception e) {
baz();
} finally {
bar();
}
如您所见,这种 between-try-catch 构造的任何合理语义都已经可以表达,而无需新的——而且相当混乱的——构造。很难为这个不冗余的结构设计一个含义。
顺便说一句,我们不能这样做的一个潜在原因是:
try {
foo();
} finally {
bar();
} catch (Exception e) {
baz();
}
可能是它不反映实际的执行顺序 - catch 块在 finally 块之前运行 。这允许 catch 块利用 finally 块可能稍后释放的资源(例如,从 RPC 对象或其他东西请求额外的诊断信息)。也可以以另一种方式工作吗?当然。这值得么?应该不会吧。