In C # e Java (e forse anche in altre lingue), le variabili dichiarate in un blocco "try" non rientrano nell'ambito dei blocchi "catch" o "finally" corrispondenti. Ad esempio, il seguente codice non viene compilato:
try {
String s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
In questo codice, si verifica un errore di compilazione nel riferimento a s nel blocco catch, poiché s è solo nell'ambito nel blocco try. (In Java, l'errore di compilazione è "impossibile risolvere"; in C # è "Il nome 's' non esiste nel contesto corrente".)
La soluzione generale a questo problema sembra essere invece dichiarare le variabili appena prima del blocco try, anziché all'interno del blocco try:
String s;
try {
s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
Tuttavia, almeno per me, (1) sembra una soluzione ingombrante, e (2) risulta che le variabili abbiano un ambito più ampio di quello previsto dal programmatore (l'intero resto del metodo, anziché solo nel contesto del try-catch-finally).
La mia domanda è: quali sono / sono le motivazioni alla base di questa decisione di progettazione del linguaggio (in Java, in C # e / o in qualsiasi altra lingua applicabile)?