Unhandled rejection là khi một Promise bị reject mà không có handler nào bắt — không .catch(), không try/catch quanh await.
javascript
Promise.reject(new Error('bùm')) // unhandled
async function f() { throw new Error('x') }
f() // unhandled — không ai await, không ai catch
f().catch(handle) // đã xử lýHậu quả khác nhau theo môi trường:
| Hành vi mặc định | |
|---|---|
| Node 15+ | kết thúc tiến trình (đổi được bằng --unhandled-rejections=warn) |
| Browser | ghi cảnh báo ra console, ứng dụng vẫn chạy |
Đặt handler bắt lỗi toàn cục ở cấp ứng dụng — để ghi log, không để nuốt lỗi:
javascript
// browser
window.addEventListener('unhandledrejection', (e) => {
reportToSentry(e.reason)
// e.preventDefault() nếu muốn chặn cảnh báo mặc định
})
// Node
process.on('unhandledRejection', (reason) => {
logger.error(reason)
process.exit(1) // để process manager khởi động lại — trạng thái đã không còn tin được
})Lưu ý — bắt lỗi muộn vẫn bị tính là unhandled:
javascript
const p = fetchData()
setTimeout(() => p.catch(handle), 1000) // quá muộn — browser đã báo "Uncaught (in promise)"; Node 15+ đã crash process, handle không kịp chạyHandler phải được gắn trong cùng lượt của event loop.
Chốt: lưới an toàn chỉ để quan sát. Chỗ sửa đúng luôn là nơi tạo ra Promise — mỗi luồng bất đồng bộ phải có chỗ chịu trách nhiệm xử lý lỗi.