簡體   English   中英

Node.js:log忽略錯誤

[英]Node.js: log ignored errors

node.js有沒有辦法記錄所有異常?

process.on('uncaughtException')對我來說還不夠,因為我需要記錄所有捕獲和未捕獲的異常,即使代碼中的某個地方有一個忽略/吞噬錯誤的catch

你們認為,在node.js有可能嗎?

一種hacky方法是使用調試上下文:

const vm = require('vm');

const Debug = vm.runInDebugContext('Debug'); // Obtain Debug object

Debug.setListener((type, _, e) => { // listen for all debug events
  if (type == Debug.DebugEvent.Exception) {
    console.log(e.exception().stack) // e is an event object
  }
});

Debug.setBreakOnException(); // this is required for Exception event to fire

try {
  throw new Error('bla');
} catch(e) {
  // ha
}

警告:不要將此代碼留在生產中,僅用於調試。

顯然,它不會調用異步錯誤,因為它們實際上並沒有被拋出,它們只是被創建為傳遞給回調。

另一種方法是替換可能的錯誤構造函數:

const OldError = Error;
const MyError = function(message) {
  const err = new OldError(message);
  OldError.captureStackTrace(err, MyError); // remove top frame from stack trace

  console.log(err.stack);

  return err;
}

MyError.prototype = Error.prototype; // Fix instanceof
global.Error = MyError;

try {
  throw new Error('bla');
} catch(e) {
}


new Error('blabla');

這樣您也可以處理異步錯誤,但不會看到是否拋出了除實例Error之外的其他內容。

如果您只對promises感興趣並且使用的是本機v8承諾,那么您可以試試這個:

const vm = require('vm');

const Debug = vm.runInDebugContext('Debug');

Debug.setListener((type, _, e) => {
  if (type == Debug.DebugEvent.PromiseEvent) {
    if (e.status() === -1) { // 0=pending, 1=resolved, -1=rejected
      console.log(e.value().value().stack);
    }
  }
});



Promise.reject(new Error('test'))
  .catch(() => {});

它可能會產生一些重復,因為它捕獲了兒童承諾拒絕以及原始承諾拒絕。

您可以附加一個類似node-inspector的調試器並激活該選項 暫停捕獲的異常 在節點檢查器中。 這不會記錄異常,而是暫停執行,這應該足以在第三方模塊中找到怪癖。

如果您正在使用WebStorm,則可以將未捕獲的異常記錄到控制台或文件中。 啟動WebStorm調試器后,打開斷點對話框並激活“JavaScript Exception Breakpoints”的“Any exception”設置和斷點操作。 這個對話框

如果您吞下異常,則無法跟蹤它們。 如果您認為您正在使用的模塊忽略了您使用錯誤模塊的例外,或者您沒有正確使用它。

如果您使用Express,則正確的方法是使用next(err)重定向所有異常和錯誤。

異常將傳遞給錯誤處理程序(注意函數中的四個參數),您可以在其中記錄它們:

router.get('/', function (req, res, next) {
    // your logic

    if(err) {
        return next(err);
    }


    return next();
});


// Error handler
app.use(function(err, req, res, next) {

    console.log(err.stack);

    res.status(err.status || 500).json({
        error: {
            code: err.code,
            message: err.message
        }
    });

    next(err);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM