In C # und in Java (und möglicherweise auch in anderen Sprachen) sind in einem "try" -Block deklarierte Variablen in den entsprechenden "catch" - oder "finally" -Blöcken nicht im Gültigkeitsbereich. Der folgende Code wird beispielsweise nicht kompiliert:
try {
String s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
In diesem Code tritt ein Kompilierungsfehler bei der Referenz auf s im catch-Block auf, da s nur im try-Block im Gültigkeitsbereich liegt. (In Java lautet der Kompilierungsfehler "s kann nicht behoben werden"; in C # heißt es "Der Name 's' existiert im aktuellen Kontext nicht".)
Die allgemeine Lösung für dieses Problem scheint darin zu bestehen, Variablen unmittelbar vor dem try-Block und nicht innerhalb des try-Blocks zu deklarieren:
String s;
try {
s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
Zumindest für mich fühlt sich dies jedoch (1) wie eine klobige Lösung an, und (2) es führt dazu, dass die Variablen einen größeren Umfang haben als vom Programmierer beabsichtigt (der gesamte Rest der Methode, anstatt nur im Kontext der try-catch-finally).
Meine Frage ist, was waren / sind die Gründe für diese Entscheidung zum Sprachdesign (in Java, in C # und / oder in anderen anwendbaren Sprachen)?