我正在使用 openode.io 來托管 nodejs 應用程式。我正在運行多人服務器。有時,由于滯后或用戶斷開連接,行程會發出未捕獲的錯誤并崩潰。我已經修復了其中一些錯誤,但在任何時候,如果用戶發送無效資料,我的行程就會崩潰。我研究了如何防止這種情況并讓 Sentry 記錄錯誤,并在 nodejs 行程開始時使用以下代碼來防止崩潰:
// prevent crashes
process.on('unhandledRejection', (reason, p) => {
logger.info(reason ' => Unhandled Rejection at Promise: ' p);
logger.info('!!!FATAL!!!')
})
process.on('uncaughtException', err => {
logger.info(err ' => Uncaught Exception thrown');
logger.info('!!!FATAL!!!');
});
我決定使用服務器上發生的常見錯誤進行測驗運行。
TypeError: Cannot set property 'canTakeThermalDamage' of undefined
File "/opt/app/server.js", line 579, col 45, in Timeout._onTimeout
host.pt[l].canTakeThermalDamage = true;
File "internal/timers.js", line 559, col 11, in listOnTimeout
File "internal/timers.js", line 500, col 7, in processTimers
這個錯誤不應該使行程崩潰,但它確實崩潰了。由于這發生在多人服務器上,因此它上的每個用戶都會斷開連接并必須再次登錄。下面是關于錯誤的哨兵日志:
當這個錯誤發生時,process.on 中的代碼運行了,但行程仍然崩潰?Sentry 是否因為發現錯誤而使其崩潰?是不是setTimeout導致的錯誤?還是另有原因?
uj5u.com熱心網友回復:
無論如何,該程序將退出。它只是為您提供了一些清理選項。
默認情況下,Node.js 通過將堆疊跟蹤列印到 stderr 并以代碼 1 退出來處理此類例外
當您添加自己的處理程式時(這是您的情況):
或者,更改“uncaughtException”處理程式中的 process.exitCode,這將導致行程以提供的退出代碼退出。否則,在存在此類處理程式的情況下,行程將以 0 退出。您可以注冊一個偵聽器,
unhandledRejection以便在退出之前進行一些清理。
閱讀更多
- 您應該修復您的代碼以不拋出例外或使用 try catch 正確處理例外
- 如果您想讓
uncaughtException處理程式始終退出行程,process.exit(1)除非您有充分的理由不這樣做
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/339487.html
