Por que `try` é uma palavra-chave explícita?

Em todas as linguagens que reconhecem exceções que eu conheço (C ++, Java, C #, Python, Delphi-Pascal, PHP), a captura de exceções requer uma explicação explícita.try bloco seguido porcatch blocos. Eu sempre me perguntava qual é a razão técnica para isso. Por que não poderíamos simplesmente acrescentarcatch cláusulas para um bloco de código comum? Como um exemplo de C ++, por que precisamos escrever isso:

int main()
{
  int i = 0;
  try {
    i = foo();
  }
  catch (std::exception& e)
  {
    i = -1;
  }
}

em vez disso:

int main()
{
  int i = 0;
  {
    i = foo();
  }
  catch (std::exception& e)
  {
    i = -1;
  }
}

Existe uma razão de implementação para isso, ou é apenas "alguém primeiro a projetou dessa maneira e agora todos estão familiarizados com ela e a copiam?"

Do meu ponto de vista, não faz sentido para linguagens compiladas - o compilador vê toda a árvore do código-fonte antes de gerar qualquer código, para poder inserir facilmente otry palavra-chave na frente de um bloco em tempo real quando umcatch A cláusula segue esse bloco (se precisar gerar código especial paratry blocos em primeiro lugar). Eu poderia imaginar algum uso em linguagens interpretadas que não analisam antecipadamente e, ao mesmo tempo, precisam tomar alguma ação no início de umtry bloco, mas não sei se existe algum desses idiomas.

Vamos deixar de lado as linguagens sem uma maneira explícita de declarar blocos arbitrários (como Python). Em todos os outros, existe uma razão técnica para exigir umatry palavra-chave (ou equivalente)?

questionAnswers(5)

yourAnswerToTheQuestion