为什么在"try“中声明的变量不在"catch”或"finally“的作用域中?

为什么在

在C#和Java语言中(可能还有其他语言),在"try“块中声明的变量不在相应的"catch”或"finally“块的作用域中。例如,以下代码无法编译:

代码语言:javascript运行复制try {

String s = "test";

// (more code...)

}

catch {

Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead

}在此代码中,catch块中对s的引用发生编译时错误,因为s仅在try块的作用域中。(在Java语言中,编译错误是“无法解析”;在C#中,错误是“名称"s”在当前上下文中不存在“)。

这个问题的一般解决方案似乎是在try块之前声明变量,而不是在try块内:

代码语言:javascript运行复制String s;

try {

s = "test";

// (more code...)

}

catch {

Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead

}然而,至少对我来说,(1)这感觉像是一个笨拙的解决方案,(2)它导致变量的作用域比程序员预期的更大(整个方法的其余部分,而不仅仅是try-catch-finally的上下文)。

我的问题是,这个语言设计决策背后的理由是什么(在Java、C#和/或任何其他适用的语言中)?