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) プログラマーが意図したよりも大きなスコープを持つ変数が発生します (メソッドのコンテキストだけではなく、メソッドの残りの部分全体)。 try-catch-finally)。
私の質問は、この言語設計の決定 (Java、C#、および/または他の適用可能な言語) の背後にある理論的根拠は何ですか?