Em C # e em Java (e possivelmente em outras linguagens também), as variáveis declaradas em um bloco "try" não estão no escopo nos blocos "catch" ou "finalmente" correspondentes. Por exemplo, o código a seguir não é compilado:
try {
String s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
Nesse código, ocorre um erro em tempo de compilação na referência a s no bloco catch, porque s está apenas no escopo no bloco try. (Em Java, o erro de compilação é "s não pode ser resolvido"; em C #, é "O nome 's' não existe no contexto atual".)
A solução geral para esse problema parece ser declarar variáveis pouco antes do bloco try, em vez de dentro do bloco try:
String s;
try {
s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
No entanto, pelo menos para mim, (1) isso parece uma solução complicada e (2) resulta em variáveis com um escopo maior do que o programador pretendia (todo o restante do método, em vez de apenas no contexto do tente pegar finalmente).
Minha pergunta é: quais foram / são as razões por trás dessa decisão de design de linguagem (em Java, em C # e / ou em qualquer outra linguagem aplicável)?