[英]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(() => {});
它可能會產生一些重復,因為它捕獲了兒童承諾拒絕以及原始承諾拒絕。
如果您吞下異常,則無法跟蹤它們。 如果您認為您正在使用的模塊忽略了您使用錯誤模塊的例外,或者您沒有正確使用它。
如果您使用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.