node.js
中有没有办法记录所有异常?
process.on('uncaughtException')
对我来说还不够,因为我需要记录所有捕获和未捕获的异常,即使代码中某处catch
忽略/吞噬了错误。
你们认为,这可能在node.js
吗?
答案 0 :(得分:6)
一种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
之外的其他内容。
如果您只对承诺感兴趣并且使用的是本机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(() => {});
它可能会产生一些重复,因为它会捕获儿童承诺拒绝以及原始承诺拒绝。
答案 1 :(得分:1)
您可以附加一个类似node-inspector的调试器,并在node-inspector中激活选项。这不会记录异常,而是暂停执行,这应该足以在第三方模块中找到怪癖。
如果您正在使用WebStorm,则可以将未捕获的异常记录到控制台或文件中。启动WebStorm调试器后,打开断点对话框并激活"任何异常"设置" JavaScript异常断点"和根据
的断点操作答案 2 :(得分:0)
如果您吞下异常,则无法跟踪它们。 如果您认为您正在使用的模块忽略了您使用错误模块的例外,或者您没有正确使用它。
如果您使用的是Express,则正确的方法是使用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);
});
重定向所有异常和错误。
异常将传递给错误处理程序(注意函数中的四个参数),然后您可以记录它们:
{{1}}