在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中,编译错误是“无法解决”;在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#和/或任何其他适用的语言)背后的基本原理是什么?