En C# et en Java (et éventuellement d'autres langues), les variables déclarées dans un "try" bloc ne sont pas dans la portée de la "capture" ou "enfin" blocs. 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, parce que s est uniquement dans la portée dans le bloc try. (En Java, l'erreur de compilation est "s ne peut pas être résolu"; en C#, c'est "Le nom de 's' n'existe pas dans le contexte actuel".)
La solution générale à ce problème semble être au lieu de déclarer des variables juste avant le bloc try, au lieu de 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 se sent comme un maladroit solution, et (2) les résultats dans les variables ayant un champ d'application plus large que le programmeur (comme l'ensemble du reste de la méthode, au lieu d'uniquement dans le contexte de la try-catch-finally).
Ma question est, quelles ont été/sont la raison d'être(s) à l'arrière de la langue de conception de décision (en Java, en C#, et/ou dans toutes autres langues)?