Почему `try` является явным ключевым словом?
На всех известных мне языках с поддержкой исключений (C ++, Java, C #, Python, Delphi-Pascal, PHP) для отлова исключений требуется явноеtry
блок с последующимcatch
блоки. Мне часто было интересно, какова техническая причина этого. Почему мы не можем просто добавитьcatch
предложения к иначе обычному блоку кода? Как пример C ++, почему мы должны написать это:
int main()
{
int i = 0;
try {
i = foo();
}
catch (std::exception& e)
{
i = -1;
}
}
вместо этого:
int main()
{
int i = 0;
{
i = foo();
}
catch (std::exception& e)
{
i = -1;
}
}
Есть ли для этого причина реализации или это просто «кто-то спроектировал это таким образом, а теперь все просто знакомы с этим и копируют его?»
На мой взгляд, для скомпилированных языков нет никакого смысла - компилятор видит все дерево исходного кода перед генерацией любого кода, поэтому он может легко вставитьtry
Ключевое слово перед блоком на лету, когдаcatch
предложение следует за этим блоком (если ему нужно сгенерировать специальный код дляtry
блоки в первую очередь). Я мог бы представить себе какое-то использование в интерпретируемых языках, которые не выполняют синтаксический анализ заранее и в то же время необходимо предпринять некоторые действия в началеtry
блок, но я не знаю, существуют ли такие языки.
Давайте оставим в стороне языки без явного способа объявления произвольных блоков (таких как Python). Во всех остальных случаях есть техническая причина, требующаяtry
ключевое слово (или эквивалент)?