Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js:日志忽略错误_Javascript_Node.js - Fatal编程技术网

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我猜是因为这不是问题的具体答案,但问题本身无法回答。无论如何,你仍然可以调试模块,看看它在哪里接受异常(对我来说似乎很奇怪,也许你使用了一个不好的模块或不正确的模块。它是哪个模块?你能发布一些代码吗?)。根据我的经验,这些错误几乎从来都不是由于模块或库中的错误,而是由于对它们的“不好”使用。也许你应该在出现问题的地方添加代码,并询问“这个承诺没有得到解决,为什么?”