Existem muitos requisitos necessários para um sistema transmitir e tratar adequadamente exceções. Também existem muitas opções para escolher um idioma para implementar o conceito.
Requisitos para exceções (em nenhuma ordem específica):
Documentação : um idioma deve ter o significado de documentar exceções que uma API pode lançar. Idealmente, este meio de documentação deve ser utilizável em máquina para permitir que compiladores e IDEs forneçam suporte ao programador.
Transmitir situações excepcionais : Essa é óbvia, para permitir que uma função transmita situações que impedem a funcionalidade chamada de executar a ação esperada. Na minha opinião, existem três grandes categorias de tais situações:
2.1 Erros no código que fazem com que alguns dados sejam inválidos.
2.2 Problemas na configuração ou outros recursos externos.
2.3 Recursos inerentemente não confiáveis (rede, sistemas de arquivos, bancos de dados, usuários finais, etc.). Esse é um caso esquecido, uma vez que sua natureza não confiável deve nos fazer esperar suas falhas esporádicas. Nesse caso, essas situações devem ser consideradas excepcionais?
Forneça informações suficientes para o código lidar com isso : As exceções devem fornecer informações suficientes para o receptor, para que ele possa reagir e possivelmente lidar com a situação. as informações também devem ser suficientes para que, quando registradas, essas exceções forneçam contexto suficiente para um programador identificar e isolar as instruções incorretas e fornecer uma solução.
Forneça confiança ao programador sobre o status atual do estado de execução de seu código : Os recursos de tratamento de exceções de um sistema de software devem estar presentes o suficiente para fornecer as salvaguardas necessárias, mantendo-se fora do caminho do programador, para que ele possa se concentrar na tarefa em mão.
Para cobrir estes, os seguintes métodos foram implementados em vários idiomas:
Exceções verificadas Fornecem uma ótima maneira de documentar exceções e, teoricamente, quando implementadas corretamente, devem fornecer ampla garantia de que tudo está bom. No entanto, o custo é tal que muitos sentem mais produtivo simplesmente ignorar ou engolir exceções ou repeti-las como exceções não verificadas. Quando usadas exceções verificadas de maneira inadequada, perdem praticamente toda a sua utilidade. Além disso, as exceções verificadas dificultam a criação de uma API estável no tempo. As implementações de um sistema genérico em um domínio específico trarão uma carga de situação excepcional que seria difícil de manter usando apenas exceções verificadas.
Exceções não verificadas - muito mais versáteis que as exceções verificadas, elas não documentam adequadamente as possíveis situações excepcionais de uma determinada implementação. Eles contam com documentação ad-hoc, se houver. Isso cria situações em que a natureza não confiável de uma mídia é mascarada por uma API que dá a aparência de confiabilidade. Além disso, quando lançadas, essas exceções perdem o significado à medida que retornam pelas camadas de abstração. Como eles são mal documentados, um programador não pode direcioná-los especificamente e muitas vezes precisa lançar uma rede muito maior do que o necessário para garantir que os sistemas secundários, caso falhem, não derrubem todo o sistema. O que nos leva de volta ao problema da deglutição, com exceção das exceções fornecidas.
Tipos de retorno com várias etapas Aqui, você deve confiar em um conjunto separado, em uma tupla ou em outro conceito semelhante para retornar o resultado esperado ou um objeto que representa a exceção. Aqui, não há desenrolamento de pilha, nenhum código de corte, tudo é executado normalmente, mas o valor de retorno deve ser validado por erro antes de continuar. Eu realmente não trabalhei com isso ainda, portanto não posso comentar por experiência própria. Reconheço que resolve algumas exceções de problemas ignorando o fluxo normal, mas ainda assim sofrerá os mesmos problemas das exceções verificadas como cansativo e constantemente "na sua cara".
Então a questão é:
Qual é a sua experiência nesse assunto e qual, segundo você, é o melhor candidato para criar um bom sistema de tratamento de exceções para um idioma?
Edição: Poucos minutos depois de escrever esta pergunta me deparei com este post , assustador!
noexcept
história em C ++ pode render muito bons insights para EH em C # e Java também.)