當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Node.js proces 'uncaughtException'事件用法及代碼示例


事件:'uncaughtException'

曆史
版本變化
v12.0.0、v10.17.0

添加了origin 參數。

v0.1.18

添加於:v0.1.18


參數
  • err <Error> 未捕獲的異常。
  • origin <string> 指示異常是源自未處理的拒絕還是源自同步錯誤。可以是 'uncaughtException''unhandledRejection' 。後者用於在基於 Promise 的異步上下文中發生異常(或者如果 Promise 被拒絕)並且 --unhandled-rejections 標誌設置為 strictthrow(這是默認值)並且拒絕未處理,或者在命令行入口點的 ES 模塊靜態加載階段發生拒絕時。

'uncaughtException' 事件在未捕獲的 JavaScript 異常一直冒泡返回事件循環時發出。默認情況下,Node.js 通過將堆棧跟蹤打印到 stderr 並使用代碼 1 退出來處理此類異常,覆蓋任何先前設置的 process.exitCode 。為 'uncaughtException' 事件添加處理程序會覆蓋此默認行為。或者,更改'uncaughtException' 處理程序中的 process.exitCode ,這將導致進程以提供的退出代碼退出。否則,在存在此類處理程序的情況下,該進程將以 0 退出。

import process from 'node:process';

process.on('uncaughtException', (err, origin) => {
  fs.writeSync(
    process.stderr.fd,
    `Caught exception: ${err}\n` +
    `Exception origin: ${origin}`
  );
});

setTimeout(() => {
  console.log('This will still run.');
}, 500);

// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');const process = require('node:process');

process.on('uncaughtException', (err, origin) => {
  fs.writeSync(
    process.stderr.fd,
    `Caught exception: ${err}\n` +
    `Exception origin: ${origin}`
  );
});

setTimeout(() => {
  console.log('This will still run.');
}, 500);

// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');

可以通過安裝 'uncaughtExceptionMonitor' 偵聽器來監視 'uncaughtException' 事件,而無需覆蓋默認行為以退出進程。

警告:使用'uncaughtException'正確地#

'uncaughtException' 是一種粗略的異常處理機製,僅用作最後的手段。該事件不應用作 On Error Resume Next 的等效項。未處理的異常本質上意味著應用程序處於未定義狀態。嘗試在未從異常中正確恢複的情況下恢複應用程序代碼可能會導致其他不可預見和不可預知的問題。

從事件處理程序中拋出的異常將不會被捕獲。相反,該進程將以非零退出代碼退出,並且將打印堆棧跟蹤。這是為了避免無限遞歸。

在未捕獲的異常後嘗試正常恢複可能類似於在升級計算機時拔掉電源線。十次有九次,什麽都沒有發生。但是第十次,係統被破壞了。

的正確使用'uncaughtException'是在關閉進程之前對分配的資源(例如文件說明符、句柄等)執行同步清理。'uncaughtException' 之後恢複正常操作是不安全的。

為了以更可靠的方式重新啟動崩潰的應用程序,無論是否發出'uncaughtException',都應在單獨的進程中使用外部監視器來檢測應用程序故障並根據需要恢複或重新啟動。

相關用法


注:本文由純淨天空篩選整理自nodejs.org大神的英文原創作品  'uncaughtException'事件。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。