Javascript Node.js:日志忽略错误
在Javascript Node.js:日志忽略错误,javascript,node.js,Javascript,Node.js,在node.js中是否有任何方法记录所有异常 process.on('uncaughtException')对我来说是不够的,因为我需要记录所有捕获和未捕获的异常,即使代码中有一个catch忽略/吞没了错误 你们认为,在node.js中有可能吗?如果您接受异常,您就无法跟踪它们。 如果您认为正在使用的模块忽略了异常,那么您使用的是错误的模块,或者您没有正确地使用它 如果使用Express,正确的方法是使用next(err)重定向所有异常和错误 异常将传递给错误处理程序(注意函数中的四个参数),您
node.js
中是否有任何方法记录所有异常
process.on('uncaughtException')
对我来说是不够的,因为我需要记录所有捕获和未捕获的异常,即使代码中有一个catch
忽略/吞没了错误
你们认为,在
node.js
中有可能吗?如果您接受异常,您就无法跟踪它们。
如果您认为正在使用的模块忽略了异常,那么您使用的是错误的模块,或者您没有正确地使用它
如果使用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);
});
一种常见的方法是使用调试上下文:
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');
通过这种方式,您还可以处理异步错误,但不会看到是否抛出了实例错误以外的其他错误
如果您只对承诺感兴趣,并且正在使用本机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(() => {});
它可能会生成一些重复项,因为它捕获子承诺拒绝以及原始承诺拒绝。您可以附加一个类似于节点检查器的调试器,并激活节点检查器中的选项。这不会记录异常,但会暂停执行,这足以在第三方模块中发现异常
如果您使用的是WebStorm,则可以将未捕获的异常记录到控制台或文件中。启动WebStorm调试器后,打开“断点”对话框,激活“JavaScript异常断点”的“任何异常”设置,并根据创建新控制台并将两个输出流定向到文件。如果您正在处理错误,那么只需添加console.error(//您的错误…然后您将记录所有错误。请参阅Node.js文档控制台。
我知道我可以从Node.js代码记录所有异常,但现在我正在寻找一种解决方案,以捕获所有异常,而不必触及引发异常的代码部分。如果您捕获错误并忽略它们,则无法跟踪它们。modyfying node.js source一个选项?如果应用程序正在捕获异常并将其丢弃(想到这一点我会感到恶心)这是一个你无法控制的第三方应用程序,除非哈利波特编写了编译器,否则记录这些错误需要一些魔法——远远超出了我的麻瓜能力。它不会记录任何被捕获和忽略的错误。当然,如果你忽略了它,你怎么能记录它?你不能。如果忽略了异常它被丢弃了。这就是为什么忽略或接受异常是不好的。我无法理解为什么你不能避免忽略异常。@zangw我猜是因为这不是问题的具体答案,但问题本身无法回答。无论如何,你仍然可以调试模块,看看它在哪里接受异常(对我来说似乎很奇怪,也许你使用了一个不好的模块或不正确的模块。它是哪个模块?你能发布一些代码吗?)。根据我的经验,这些错误几乎从来都不是由于模块或库中的错误,而是由于对它们的“不好”使用。也许你应该在出现问题的地方添加代码,并询问“这个承诺没有得到解决,为什么?”