捕获Node js app的所有uncaughtException

时间:2016-11-29 13:38:38

标签: node.js express

我有一个问题:如何为我的节点应用程序处理所有未被捕获的异常(操作/开发人员错误将关闭所有服务)。然后,每当发现错误时,我都可以向我发送电子邮件提醒。

3 个答案:

答案 0 :(得分:34)

您可以使用process'unhandledRejection'和'uncaughtException'事件。

另请注意,在uncaughtException'之后恢复正常操作是不安全的,因为the system becomes corrupted

  

正确使用'process .on('unhandledRejection', (reason, p) => { console.error(reason, 'Unhandled Rejection at Promise', p); }) .on('uncaughtException', err => { console.error(err, 'Uncaught Exception thrown'); process.exit(1); }); '是为了执行同步   清理已分配的资源(例如文件描述符,句柄等)   在关闭这个过程之前。

示例:

SELECT t.customerid,
       COUNT(*) as cnt,
       MAX(CASE WHEN t.productid = 1 THEN 1 ELSE 0 END) as first,
       MAX(CASE WHEN t.productid = 2 THEN 1 ELSE 0 END) as second,
       MAX(CASE WHEN t.productid = 3 THEN 1 ELSE 0 END) as third
FROM YourTable t
GROUP BY t.customerid

答案 1 :(得分:8)

您可以使用域名API:https://nodejs.org/api/domain.html 但它已被弃用,无论如何也不推荐。

通常,您希望在任何可能发生的地方处理错误,并避免采用“全部捕获”方法。

如果发生错误,忽略它就没有动力去解决它,在某些情况下可能会导致你甚至不知道你的程序出现故障。

相反,处理它的最佳方法是让程序崩溃,记录崩溃(和堆栈/核心转储),然后使用pm2或nodemon自动重启它。

对于Joyent(节点创建者)的(非常)漫长但富有洞察力的演讲,我强烈建议您阅读以下链接:Error handling in Node.JS

还有process.on('uncaughtException')事件(您也不应该使用)

修改:了解更多细节并尝试解决您的问题。 使用像pm2这样的软件在崩溃时重新启动应用程序,您还可以看到error.log,它将为您提供堆栈跟踪。因此,似乎您仍然需要的唯一事情是警报崩溃。

为此,你可能想看看像keymetrics这样的接口(同样是pm2的人),这些接口可能会提醒你错误。

我很久以前使用过的一个很酷的解决方案如下:

  • 当您的应用(重新)启动时,它会查找错误日志
  • 如果找到,则会提醒您日志文件的内容
  • 然后将错误日志文件重命名/移动到其他位置

我不需要推荐这个解决方案,但它符合您需要的所有规格,所以玩得开心!

Edit2:如果您想深入研究服务开发和最佳实践的主题,请查看@Paul在评论中建议的链接:https://12factor.net/

答案 2 :(得分:0)

最好的方法是让应用程序崩溃,记录错误然后重新启动进程。你可以像这样做

var cluster = require('cluster');

var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  for (var i = 0; i < numCPUs; ++i) {
    cluster.fork();
  }
  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`);
    cluster.fork();
  });
} else {
  var http = require('http');
  var httpServer = http.createServer(app).listen(httpPort, function () {
      console.log('process id local', process.pid)
      console.log("http server started at port " + httpPort);
  });
}

process.on('uncaughtException', function (err) {
  console.error((new Date).toUTCString() + ' uncaughtException:', err.message)
  console.error(err.stack)
  process.exit(1)
})

`