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