Perché le variabili dichiarate in “prova” non sono incluse in “catch” o “finally”?

In C # e in Java (e probabilmente anche in altri linguaggi), le variabili dichiarate in un blocco “try” non sono nell’ambito dei corrispondenti blocchi “catch” o “finally”. 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 in fase di compilazione sul riferimento a s nel blocco catch, poiché s è solo nell’ambito del blocco try. (In Java, l’errore di compilazione è “s non può essere risolto”; in C #, è “Il nome” non esiste nel contesto corrente “).

La soluzione generale a questo problema sembra essere quella di dichiarare invece 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 } 

Comunque, almeno per me, (1) questo sembra una soluzione goffo, e (2) risulta nelle variabili che hanno un ambito più ampio di quello previsto dal programmatore (l’intero resto del metodo, invece che solo nel contesto del try-catch-finally).

La mia domanda è: quali erano / sono le motivazioni alla base di questa decisione sul design del linguaggio (in Java, in C # e / o in altre lingue applicabili)?