Você pode recomendar um padrão de design / abordagem para expor / tolerar / recuperar de erros do sistema, tratamento de exceções (Java, C ++, Perl, PHP)?
Alguns erros precisam ser relatados.
Alguns erros podem ser tratados internamente (por uma nova tentativa ou são irrelevantes (podem ser ignorados).
Como você estrutura o código para capturá-los?
Mas todos os erros precisam ser registrados.
Quais práticas recomendadas existem?
E para simulá-los para poder testar completamente os componentes que são impactados por eles?
Pergunta geral específica da linguagem não de programação aplicável a várias linguagens de programação modernas, mas gostaria de receber exemplos de ilustrações de padrões, abordagens e filosofias em Java, C ++, PHP e Perl.
(Também solicitado no stackoverflow: /programming/7432596/recommend-a-design-pattern-approach-to-exposing-tolerating-recovering-from-system, mas achei que também deveria ser solicitado aos programadores porque Acho que as perguntas e respostas dos programadores abordam questões mais amplas de software / programação, enquanto o stackoverflow é mais sobre a implementação técnica IMHO).
fonte
Respostas:
Falhar rápido é uma ótima abordagem de design e talvez possa ser contada como um padrão: http://en.wikipedia.org/wiki/Fail-fast
Também achei vários princípios úteis:
fonte
Tendo trabalhado com exceções em Java e .NET E depois de ler muitos artigos sobre como / quando / por que capturar exceções, finalmente cheguei às etapas a seguir que passo em minha cabeça sempre que vejo uma possível exceção acontecendo, ou um exceção eu devo pegar (Java) ... mesmo que isso nunca aconteça (suspiro ...). E parece estar funcionando, pelo menos para mim:
Devo também adicionar a etapa 0 , onde propositalmente estou lançando o que chamo de exceção "comercial" (uma nova exceção criada ao estender a classe "Exception") quando algum tratamento complexo não pode ser executado devido a erros de dados, MAS é conhecido por acontecer, pois foram identificados como casos de exceção durante a análise.
Exceto pela parte de registro, concordo plenamente com os pontos escritos por "mikera"; Vou apenas acrescentar que a exceção deve ser registrada apenas uma vez .
Além disso, as etapas listadas podem ser diferentes se o que você está escrevendo é uma API / Framework . Lá, lançar exceções bem projetadas é obrigatório para ajudar os desenvolvedores a entender seus erros.
Quanto ao teste das exceções, usando objetos simulados, você deve poder testar quase tudo, seja ele excepcional ou não, desde que suas classes respeitem a melhor prática "uma classe para fazer uma coisa". Pessoalmente, também certifico-me de marcar os métodos mais importantes, mas ocultos, como "protegidos" em vez de "privados", para que eu possa testá-los sem muito trabalho. Além disso, testar exceções é simples, apenas provoque a exceção e "espere" que uma exceção ocorra capturando-a. Se você não receber uma exceção, terá um erro de caso de teste de unidade.
fonte
Crie seus objetos da maneira certa, não se preocupe com fatores externos. Se você optar por tirar proveito das exceções, faça seus objetos lançarem exceções se eles falharem em algo.
Depois que todos os seus objetos estiverem funcionando corretamente, deve ser bastante fácil criar uma hierarquia de responsabilidade limpa no tratamento de erros em seu design.
fonte