Captura Global de Erros Desconhecidos em Node.js com Process Events
Falhas inesperadas e Promises rejeitadas sem tratamento podem derrubar aplicações Node.js em produção sem deixar vestígios claros do problema. O uso dos manipuladores globais uncaughtException e unhandledRejection no objeto process permite interceptar esses erros críticos, registrar diagnósticos detalhados e realizar o desligamento gracioso (graceful shutdown) do sistema.
JavaScript
/**
* Intercepta rejeições de Promises que não possuem bloco .catch()
*/
process.on('unhandledRejection', (motivo, promessa) => {
console.error(' [ALERTA] Promise rejeitada sem tratamento:');
console.error('Motivo:', motivo);
// O ideal é registrar em um serviço de logs (ex: Winston, Sentry)
});
/**
* Intercepta exceções síncronas que não foram capturadas por try/catch
*/
process.on('uncaughtException', (erro) => {
console.error(' [CRÍTICO] Exceção síncrona não tratada:', erro.message);
console.error(erro.stack);
// Fecha conexões e encerra o processo com código de erro
console.log('Encerrando aplicação de forma segura...');
process.exit(1);
});
// --- Exemplo Prático de Uso ---
// 1. Simulação de Promise Rejeitada sem .catch()
setTimeout(() => {
Promise.reject(new Error('Falha de conexão com a API externa'));
}, 500);
// 2. Simulação de Exceção Síncrona não capturada
setTimeout(() => {
// Chamada de função inexistente dispara uncaughtException
funcaoInexistente();
}, 1500);
Pontos-chave
- Obrigatoriedade do
process.exit(1)emuncaughtException: Após um erro síncrono não tratado, o estado da aplicação torna-se imprevisível e inseguro; encerrar o processo é fundamental para que gerenciadores de processos (PM2, Docker/Kubernetes) possam reiniciá-lo limpo. - Comportamento do
unhandledRejection: Intercepta falhas assíncronas em Promises esquecidas sem.catch(), permitindo tratar o log antes que o Node.js encerre a aplicação abruptamente em versões modernas. - Ordem de Execução: Estes manipuladores agem como a última linha de defesa do sistema e não devem substituir o uso adequado de blocos
try/catche middlewares de erro em frameworks como Express ou Fastify. - Prática Recomendada em Produção: Utilize estes eventos para enviar alertas a ferramentas de monitoramento de erros (ex: Datadog, Sentry) e liberar recursos abertos, como pools de banco de dados e servidores HTTP, antes da finalização.
