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)?