为什么变量不在“catch”或“finally”的作用域中的“try”中声明?
2022-08-31 07:16:47
在 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无法解决”;在C#中,它是“名称's'在当前上下文中不存在”。
此问题的一般解决方案似乎是在 try 块之前声明变量,而不是在 try 块中声明变量:
String s;
try {
s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
然而,至少对我来说,(1)这感觉像是一个笨拙的解决方案,(2)它导致变量的范围比程序员预期的要大(整个方法的其余部分,而不是仅在尝试捕获最终的上下文中)。
我的问题是,这种语言设计决策背后的基本原理是什么(在Java中,在C#中,和/或任何其他适用的语言中)?