Tive a "oportunidade" de salvar vários projetos e os executivos substituíram toda a equipe de desenvolvimento porque o aplicativo apresentava muitos erros e os usuários estavam cansados dos problemas e contornos. Todas essas bases de código tinham tratamento centralizado de erros no nível do aplicativo, como a resposta mais votada descreve. Se essa resposta é a melhor prática, por que não funcionou e permitiu que a equipe de desenvolvimento anterior resolvesse problemas? Talvez às vezes não funcione? As respostas acima não mencionam quanto tempo os desenvolvedores passam consertando problemas únicos. Se o tempo para resolver problemas é a métrica principal, o código de instrumentação com blocos try..catch é uma prática recomendada.
Como minha equipe resolveu os problemas sem alterar significativamente a interface do usuário? Simples, todos os métodos foram instrumentados com o try..catch bloqueado e tudo foi registrado no ponto de falha com o nome do método, os valores dos parâmetros do método concatenados em uma sequência passada juntamente com a mensagem de erro, a mensagem de erro, o nome do aplicativo, a data, e versão. Com essas informações, os desenvolvedores podem executar análises sobre os erros para identificar a exceção que mais ocorre! Ou o espaço para nome com o maior número de erros. Também pode validar que um erro que ocorre em um módulo seja tratado adequadamente e não seja causado por vários motivos.
Outro benefício profissional disso é que os desenvolvedores podem definir um ponto de interrupção no método de registro de erros e, com um ponto de interrupção e um único clique no botão de depuração "sair", eles estão no método que falhou com acesso total ao objetos no ponto de falha, convenientemente disponíveis na janela imediata. Isso facilita a depuração e permite arrastar a execução de volta ao início do método para duplicar o problema e encontrar a linha exata. O tratamento centralizado de exceções permite que um desenvolvedor replique uma exceção em 30 segundos? Não.
A declaração "Um método só deve capturar uma exceção quando pode lidar com isso de alguma maneira sensata". Isso implica que os desenvolvedores podem prever ou encontrarão todos os erros que podem ocorrer antes do lançamento. Se isso fosse verdade, o manipulador de exceções de aplicativos não seria necessário e não haveria mercado para Elastic Search e logstash.
Essa abordagem também permite que os desenvolvedores encontrem e corrijam problemas intermitentes na produção! Deseja depurar sem um depurador na produção? Ou você prefere atender e receber e-mails de usuários chateados? Isso permite que você corrija problemas antes que alguém saiba e sem precisar enviar e-mail, mensagens instantâneas ou Slack com suporte, pois tudo o que é necessário para corrigir o problema está aqui. 95% dos problemas nunca precisam ser reproduzidos.
Para funcionar corretamente, ele precisa ser combinado com o log centralizado que pode capturar o espaço para nome / módulo, nome da classe, método, entradas e mensagem de erro e armazenar em um banco de dados para que possa ser agregado para destacar qual método falha mais, para que possa ser corrigido primeiro.
Às vezes, os desenvolvedores escolhem lançar exceções na pilha a partir de um bloco catch, mas essa abordagem é 100 vezes mais lenta que o código normal que não gera. Captura e liberação com registro é o preferido.
Essa técnica foi usada para estabilizar rapidamente um aplicativo que falhou a cada hora para a maioria dos usuários em uma empresa da Fortune 500 desenvolvida por 12 desenvolvedores ao longo de 2 anos. Usando essas 3000 exceções diferentes, foram identificadas, corrigidas, testadas e implantadas em 4 meses. A média é de uma correção a cada 15 minutos, em média, por 4 meses.
Concordo que não é divertido digitar tudo o que é necessário para instrumentar o código e prefiro não olhar para o código repetitivo, mas adicionar 4 linhas de código a cada método vale a pena a longo prazo.