Mid #error-handling#uncaughtException#unhandledRejection#promise
Xử lý lỗi trong Node.js: uncaughtException và unhandledRejection
⚡ Trả lời nhanh
uncaughtException và unhandledRejection là lưới an toàn cuối, không phải cách xử lý lỗi bình thường. Sau khi bắt, nên log rồi tắt process có kiểm soát (để PM2/K8s khởi động lại) vì trạng thái có thể đã hỏng. Từ Node 15, unhandled rejection mặc định làm crash process.
process.on("unhandledRejection", (reason) => {
logger.error({ reason }, "unhandledRejection");
throw reason; // chuyển thành uncaughtException
});
process.on("uncaughtException", (err) => {
logger.fatal(err, "uncaughtException");
shutdown(1); // đóng gọn rồi thoát, không tiếp tục chạy
});
Phân loại lỗi:
- Operational (dữ liệu sai, DB timeout, 404): dự đoán được, xử lý và trả lỗi phù hợp.
- Programmer error (TypeError, bug): không phục hồi được, nên crash và restart.
Thực hành tốt:
asynchandler trong Express 4 không tự chuyển lỗi sang error middleware; bọc try/catch hoặc dùng wrapper (Express 5 hỗ trợ sẵn).- Callback style: luôn kiểm tra
errđầu tiên;EventEmitterpháterrormà không có listener sẽ throw. - Dùng
Errorcócause,codeđể phân loại; không ném string.