Jerry disse: ... o resultado não é mais C ++ , enquanto minha metáfora é que é claramente C ++, apenas um dialeto ligeiramente diferente porque os programas utilizam outras formas, convenções e estilos de escrita.
Aqui estão meus principais motivos para desativá-los:
Compatibilidade binária
O cruzamento de fronteiras de idioma e tradução não é universalmente bem definido ou indefinido. Se você deseja garantir que seu programa opere no domínio do comportamento definido, será necessário colocar em quarentena as exceções nos pontos de saída do módulo.
Tamanho do executável
Aqui estão os tamanhos binários de um programa livre de exceção que escrevi, construído sem e com as exceções ativadas:
Sem exceções:
- executável + dependências: 330
- executável final separado (compilação do release): 37
Com exceções:
- executável + dependências: 380
- executável com remoção final (compilação do release): 44
Lembrete: é uma coleção de bibliotecas e programas que contêm zero jogadas / capturas. A bandeira compilador faz permitir exceções na biblioteca padrão do C ++. Portanto, o custo no mundo real é superior a 19% visto neste exemplo.
Compilador: apple gcc4.2 + llvm. Tamanhos em MB.
Rapidez
Apesar do termo "exceções de custo zero", elas ainda adicionam alguma sobrecarga, mesmo quando nada é lançado. No caso acima, é um programa crítico de desempenho (processamento, geração, apresentação, conversões de sinais, com grandes conjuntos de dados / sinais etc.). Exceções não são um recurso necessário neste design, enquanto o desempenho é muito importante.
Correção do programa
Parece um motivo estranho ... Se jogar não é uma opção, você deve escrever programas relativamente rigorosos, corretos e bem testados para garantir que seu programa seja executado corretamente e que os clientes usem as interfaces corretamente (se você me der um argumento ruim ou não) Para verificar um código de erro, você merece UB). O resultado? A qualidade da implementação melhora muito e os problemas são corrigidos rapidamente.
Simplicidade
As implementações de manipulação de exceção nem sempre são atualizadas. Eles também adicionam muita complexidade, porque uma implementação pode ter muitas sequências de saída. É mais simples ler e manter programas altamente complexos quando eles usam um pequeno conjunto de estratégias de saída bem definidas e digitadas, que passam por bolhas e são tratadas pelo cliente. Em outros casos, as implementações podem, com o tempo, implementar mais lances ou suas dependências podem introduzi-las. Os clientes não podem se defender fácil ou adequadamente contra todas essas saídas. Eu escrevo e atualizo muitas bibliotecas, há evolução e aprimoramento freqüentes. Tentar manter isso tudo sincronizado com as seqüências de saída de exceção (em uma grande base de código) não seria um bom uso do tempo e provavelmente adicionaria muito ruído e sujeira. Devido ao aumento da correção do programa e a mais testes,
Histórico / Código Existente
Em alguns casos, eles nunca foram introduzidos por razões históricas. Uma base de código existente não os utilizava, alterar os programas poderia levar anos-homem e tornar a manutenção realmente feia devido à sobreposição de convenções e implementações.
Desvantagens
Obviamente, existem desvantagens, as maiores são: Incompatibilidade (inclusive binária) com outras bibliotecas e o fato de que você precisará implementar uma boa quantidade de programas para se ajustar a esse modelo.