En C # et en Java (et peut-être aussi dans d'autres langages), les variables déclarées dans un bloc "try" ne sont pas dans la portée des blocs "catch" ou "finally" correspondants. Par exemple, le code suivant ne compile pas:
try {
String s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
Dans ce code, une erreur de compilation se produit sur la référence à s dans le bloc catch, car s est uniquement dans la portée du bloc try. (En Java, l'erreur de compilation est "s ne peut pas être résolu"; en C #, c'est "Le nom 's' n'existe pas dans le contexte actuel".)
La solution générale à ce problème semble être à la place de déclarer des variables juste avant le bloc try, plutôt que dans le bloc try:
String s;
try {
s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
Cependant, au moins pour moi, (1) cela ressemble à une solution maladroite, et (2) il en résulte que les variables ont une portée plus large que celle prévue par le programmeur (tout le reste de la méthode, au lieu de seulement dans le contexte de la essayez-attrapez-enfin).
Ma question est la suivante: quelle était / sont la ou les raisons derrière cette décision de conception de langage (en Java, en C # et / ou dans tout autre langage applicable)?