C#およびJava(およびその他の言語も)では、「try」ブロックで宣言された変数は、対応する「catch」または「finally」ブロックのスコープにはありません。たとえば、次のコードはコンパイルされません。
try {
String s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
このコードでは、sはtryブロックのスコープ内にのみ存在するため、catchブロックのsへの参照でコンパイル時エラーが発生します。(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#、および/または他の該当する言語で)?