У C # і в Java (і, можливо, в інших мовах) змінні, оголошені в блоці "спробувати", не знаходяться в межах відповідних блоків "catch" або "нарешті". Наприклад, наступний код не компілюється:
try {
String s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
У цьому коді помилка часу компіляції виникає при посиланні на s у блоці вилову, оскільки s є лише в області дії у блоці спробу. (У Java помилка компіляції "s не може бути усунена"; у C # це "ім'я 's" не існує в поточному контексті ".)
Загальним рішенням цієї проблеми, здається, є замість оголошення блоку змін перед блоком спробу, а не в блоці спробу:
String s;
try {
s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
Однак, принаймні, мені (1) це здається незграбним рішенням, і (2) це призводить до того, що змінні мають більший обсяг, ніж планував програміст (весь залишок методу, а не лише в контексті пробувати-нарешті).
Моє запитання полягає в тому, які обґрунтування (-ла), що лежать в основі цього мовного рішення (на Java, в C # та / або будь-яких інших застосовних мовах)?