Глобальный обработчик непойманных исключений:
process.on('uncaughtException', (err, origin) => {
console.error('Uncaught Exception:', err);
// Обязательно завершаем процесс в продакшене
process.exit(1);
});
Особенности:
Обработка необработанных Promise rejections:
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
});
Ранее использовались domains для обработки:
const domain = require('domain');
const d = domain.create();
d.on('error', (err) => {
console.error('Domain caught:', err);
});
d.run(() => {
throw new Error('Failed!');
});
Сейчас: Рекомендуется использовать async_hooks
process.on('uncaughtException', (err) => {
logger.fatal(err, 'Uncaught Exception');
metrics.increment('server.errors.uncaught');
process.exit(1);
});
process.on('uncaughtException', async (err) => {
await closeDatabaseConnections();
await sendAlertToOpsTeam(err);
process.exit(1);
});
Неправильно:
process.on('uncaughtException', () => {
// Продолжение работы после ошибки
});
const { fork } = require('child_process');
const child = fork('server.js');
child.on('error', (err) => {
// Ошибки в дочернем процессе
});
child.on('exit', (code) => {
// Завершение дочернего процесса
});
async function main() {
throw new Error('Async error');
}
main(); // Попадет в unhandledRejection
const EventEmitter = require('events');
const emitter = new EventEmitter();
emitter.on('error', (err) => {
// Обработка ошибок конкретного emitter
});
Глобальные обработчики:
uncaughtException
для синхронных ошибокunhandledRejection
для PromiseКритические правила:
Лучшие практики:
Эволюция API:
Особенности Node.js:
Правильная обработка непойманных исключений критична для надежности Node.js приложений в production.