На разных языках (по крайней мере, на Java, подумайте также C #?) Вы можете делать такие вещи, как
if( condition )
singleStatement;
while( condition )
singleStatement;
for( var; condition; increment )
singleStatement;
Поэтому, когда у меня есть только одно утверждение, мне не нужно добавлять новую область с помощью { }
. Почему я не могу сделать это с помощью try-catch?
try
singleStatement;
catch(Exception e)
singleStatement;
Есть ли что-то особенное в try-catch, которое требует всегда иметь новую область видимости или что-то в этом роде? И если так, не может ли компилятор это исправить?
for
частей должно быть указано что-то вродеinitial
,condition
и,step
поскольку нетinitial
необходимости определять переменную иstep
не должно быть приращения.if
, всегда является одним утверждением, а несколько утверждений, заключенных в фигурные скобки, составляют одно утверждение. Но я один из тех, кто всегда ставит фигурные скобки в любом случае, так что ...throw
иreturn
, и, как сказал @detly, если вы рассматриваете фигурные скобки как одну группу утверждений, я не нахожу это несовместим либо. Я никогда не понимал, что это за «множество ошибок кодирования», о которых говорили люди. Люди должны начать обращать внимание на то, что они делают, использовать правильные абзацы и проходить модульные тесты: у П никогда не было проблем с этим ...Ответы:
ИМО, они включены в Java и C # прежде всего потому, что они уже существовали в C ++. Таким образом, реальный вопрос заключается в том, почему C ++ таков. Согласно Проекту и Развитию C ++ (§16.3):
Редактировать: Что касается того, почему это было бы непонятно, я думаю, что нужно только взглянуть на неправильные утверждения в ответе @Tom Jeffery (и, особенно, на количество полученных «за»), чтобы понять, что возникнет проблема. Для парсера это на самом деле ничем не отличается от сопоставления
else
s сif
s - без скобок для принудительного создания другой группировки всеcatch
предложения будут совпадать с самыми последнимиthrow
. Для тех порожденных языков, которые включают его,finally
пункты будут делать то же самое. С точки зрения синтаксического анализатора, это вряд ли достаточно отличается от текущей ситуации, чтобы заметить - в частности, поскольку грамматики стоят сейчас, на самом деле нечего группироватьcatch
предложения вместе - скобки группируют операторы, контролируемыеcatch
пункты, а не сами предложения.С точки зрения написания парсера, разница почти слишком мала, чтобы заметить. Если мы начнем с чего-то вроде этого:
Тогда разница будет между:
а также:
Аналогично, для предложений catch:
против
Хотя определение полного блока try / catch не нужно менять вообще. В любом случае это будет что-то вроде:
[Здесь я использую,
[whatever]
чтобы указать что-то необязательное, и я опускаю синтаксис для,finally_clause
так как я не думаю, что это имеет какое-либо отношение к вопросу.]Даже если вы не пытаетесь следовать всем Yacc-как определение грамматики там, точку можно резюмировать довольно легко: это последнее утверждение (начиная с
try_block
) является тот , гдеcatch
пункты получить сопоставляется сtry
пунктами - и остается именно То же самое, требуется ли скобки или нет.Повторим / Подведем итог: скобки группа вместе операторы , контролируемые с помощью тех
catch
х, но делать не группироватьcatch
сами с. Как таковые, эти скобки не имеют абсолютно никакого влияния на решение, котороеcatch
идет с какимtry
. Для парсера / компилятора задача одинаково легка (или сложна) в любом случае. Несмотря на это, @ ответ Тома (и количество повышающих голосов , которыми она получила) обеспечивает достаточную демонстрацию того факта , что такое изменение бы почти наверняка запутать пользователь.источник
try return g(); catch(xxii) error("G() goofed: xxii");
как бы это ни было хорошо ИМОВ ответе о том, почему скобки требуются для некоторых конструкций с одним утверждением, но не для других , Эрик Липперт написал:
Другими словами, команде разработчиков было дороже реализовать ее, чем было оправдано, так как это дало бы предельную выгоду.
источник
Я думаю, что это нужно для того, чтобы избежать проблем со стилем. Следующее было бы неоднозначным ...
Это может означать это:
Или...
источник
if
случая не существует нескольких возможных повисших других предложений . Легко просто сказать «хорошо, остальное связывает с самым внутренним, если» и покончить с этим. Но для try / catch это не работает.Я думаю, что основная причина в том, что в C # мало что можно сделать, для чего понадобится блок try / catch, состоящий всего из одной строки. (Я не могу сейчас думать о вершине моей головы). У вас может быть правильная точка с точки зрения блока catch, например, однострочный оператор для записи чего-либо, но с точки зрения читабельности имеет смысл (по крайней мере для меня) требовать {}.
источник