Node.js:log忽略错误

时间:2016-01-26 11:26:15

标签: javascript node.js

node.js中有没有办法记录所有异常?

process.on('uncaughtException')对我来说还不够,因为我需要记录所有捕获和未捕获的异常,即使代码中某处catch忽略/吞噬了错误。

你们认为,这可能在node.js吗?

3 个答案:

答案 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中激活选项Pause on caught Exceptions。这不会记录异常,而是暂停执行,这应该足以在第三方模块中找到怪癖。

如果您正在使用WebStorm,则可以将未捕获的异常记录到控制台或文件中。启动WebStorm调试器后,打开断点对话框并激活"任何异常"设置" JavaScript异常断点"和根据this dialog

的断点操作

答案 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}}