在 C# 和 Java(可能还有其他语言)中,在“try”块中声明的变量不在相应的“catch”或“finally”块的范围内。例如,以下代码无法编译:
try {
String s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
在这段代码中,catch 块中对 s 的引用会发生编译时错误,因为 s 仅在 try 块的范围内。(在 Java 中,编译错误是“s cannot be resolved”;在 C# 中,是“The name 's' does not exist in the current context”。)
这个问题的一般解决方案似乎是在 try 块之前声明变量,而不是在 try 块中:
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# 和/或任何其他适用的语言中)?