Estou ponderando esse problema há um tempo e me vejo continuamente encontrando advertências e contradições, por isso espero que alguém possa produzir uma conclusão para o seguinte:
Favorecer exceções sobre códigos de erro
Pelo que sei, ao trabalhar na indústria há quatro anos, lendo livros e blogs etc., a melhor prática atual para lidar com erros é lançar exceções, em vez de retornar códigos de erro (não necessariamente um código de erro, mas um tipo que representa um erro).
Mas - para mim isso parece contradizer ...
Codificação para interfaces, não implementações
Codificamos para interfaces ou abstrações para reduzir o acoplamento. Não sabemos, ou queremos saber, o tipo específico e a implementação de uma interface. Então, como podemos saber quais exceções devemos procurar capturar? A implementação pode gerar 10 exceções diferentes ou nenhuma. Quando pegamos uma exceção, certamente estamos fazendo suposições sobre a implementação?
A menos que - a interface tenha ...
Especificações de exceção
Algumas linguagens permitem que os desenvolvedores afirmem que certos métodos lançam certas exceções (Java, por exemplo, usa a throws
palavra - chave.) Do ponto de vista do código de chamada, isso parece bom - sabemos explicitamente quais exceções precisamos capturar.
Mas - isso parece sugerir uma ...
Abstração com vazamento
Por que uma interface deve especificar quais exceções podem ser lançadas? E se a implementação não precisar lançar uma exceção ou precisar lançar outras exceções? No nível da interface, não há como saber quais exceções uma implementação pode querer lançar.
Assim...
Concluir
Por que as exceções são preferidas quando parecem (aos meus olhos) contradizer as melhores práticas de software? E, se os códigos de erro são tão ruins (e eu não preciso ser vendido pelos vícios dos códigos de erro), existe outra alternativa? Qual é o estado da arte atual (ou em breve) para tratamento de erros que atende aos requisitos das melhores práticas descritas acima, mas não depende de código de chamada que verifique o valor de retorno dos códigos de erro?