En C # y en Java (y posiblemente también en otros lenguajes), las variables declaradas en un bloque "try" no están dentro del alcance en los bloques "catch" o "finalmente" correspondientes. Por ejemplo, el siguiente código no se compila:
try {
String s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
En este código, se produce un error en tiempo de compilación en la referencia a s en el bloque catch, porque s solo está dentro del alcance en el bloque try. (En Java, el error de compilación es "s no se puede resolver"; en C #, es "El nombre 's' no existe en el contexto actual").
La solución general a este problema parece ser declarar variables justo antes del bloque try, en lugar de dentro del bloque try:
String s;
try {
s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
Sin embargo, al menos para mí, (1) esto se siente como una solución torpe, y (2) da como resultado que las variables tengan un alcance mayor que el programador previsto (todo el resto del método, en lugar de solo en el contexto del intentar-atrapar-finalmente).
Mi pregunta es, ¿cuáles fueron / son las razones detrás de esta decisión de diseño de lenguaje (en Java, en C # y / o en cualquier otro lenguaje aplicable)?