Estou no processo de refatoração de um aplicativo Web bastante grande. Um dos principais problemas é o tratamento inconsistente de erros e estou tentando criar uma estratégia sensata. Eu criei um manipulador de erro personalizado, via set_error_handler que essencialmente gera erros de PHP em ErrorExceptions e uma classe de exceção de base personalizada, que herda diretamente de Exception .
Na produção, estou usando um catch-all genérico de exceção, via set_exception_handler , e estou prestes a adicionar o log de exceção * ao mix. Meu dilema é onde fazer o log real, na classe de exceção básica ou no catch-all.
Eu pensei em algumas razões para registrá-lo no catch-all:
- Existem algumas exceções no código que precisam ser convertidas em algum filho apropriado da classe de exceção base. Até que isso aconteça, nem todas as exceções serão registradas.
- De alguma forma, parece mais natural fazê-lo de uma maneira geral, uma classe de exceção básica não deve fazer mais do que ser apenas isso. (Pode ser um princípio único de responsabilidade, mas pode ser apenas um sentimento equivocado)
e um motivo para efetuar login na classe de exceção básica:
- Atualmente, o catch-all é usado apenas na produção. Seria fácil introduzi-lo em nossos outros ambientes (desenvolvimento, teste), mas isso exigiria alguns ajustes, pois os erros são tratados de maneira diferente por ambiente, pois na produção eles são traduzidos para páginas de erro 404/503.
Existe alguma prática aceitável para onde registrar exceções?
* O registro envolverá a gravação em um arquivo de texto primeiro e poderá evoluir para o envio de e-mails para certos tipos de exceções.
Alguns esclarecimentos, solicitados pela resposta do @ unholysampler :
Estou enfrentando uma base de código 2 * 10 ^ 6 sloc, com muitas coisas de terceiros sobre as quais não tenho controle, e parte do código que tenho controle sobre exceções anteriores a datas no PHP. E há também um código recente de baixa qualidade. Estamos nos recuperando de um longo período de intensa pressão em que praticamente tivemos que parar de pensar e apenas hackear.
Estamos refatorando ativamente para solucionar todas as inconsistências e introduzir uma abordagem sensata de tratamento de erros, mas isso levará algum tempo. Estou mais interessado no que fazer até chegar ao ponto em que os erros são tratados adequadamente. Provavelmente vou fazer outra pergunta sobre uma estratégia sensata de exceção em algum momento.
A principal motivação por trás do registro é receber um email no meu telefone sempre que algo de ruim acontece na produção. Eu não me importo se os despejos de dados ficarem enormes, se eles tiverem um trabalho cron excluindo os antigos de vez em quando.
fonte
Se o seu idioma / tempo de execução não permitir facilmente determinar a fonte da exceção, é possível registrá-lo imediatamente. C ++ e alguns mecanismos JS não expõem o arquivo + a linha ou a pilha de chamadas da exceção no momento em que você a capturou / mas essas informações estão disponíveis no momento em que você cria a exceção.
Nossa solução foi fornecer um mecanismo que usasse a configuração de tempo de execução para permitir o registro do tipo da exceção junto com uma pilha barata ao tentar diagnosticar esses problemas.
fonte