【问题标题】:uncaughtException not catching thrown ErrorsuncaughtException 未捕获抛出的错误
【发布时间】:2015-10-05 05:39:25
【问题描述】:

我正在使用 Node.js 开发一个 api,并了解了一个选项,可以在我的应用程序崩溃之前最后一次查看我的错误...(uncaughtException)

注意:我已经充分了解了一些人不喜欢此功能的所有原因,因此请不要在此处发布这些担忧。

我遇到的问题是这样的:

我为不同的代码创建自定义错误类。例如Redis_Exception,它将响应我的缓存层中的错误而被抛出。

但是,以下内容不会出现在我的 uncaughtException 函数中:

throw new Redis_Exception('Some error here');

相反,我的应用只是将Redis_Exception: Some error here 打印到控制台。没有像往常一样的堆栈跟踪。

以这种方式引发的错​​误不会冒泡到我的应用程序进程的顶部是否有某种原因?

【问题讨论】:

  • 听起来像是其他东西在异常冒泡到事件之前捕获了它。
  • 是的,我的印象可能是这样。我还没有编写任何其他代码来处理异常。我正在使用 express 来路由请求。那里可能有什么东西?
  • 不添加uncaughtException处理程序是否会正常崩溃?
  • 不幸的是它不是。每当我抛出错误时,它只会将消息打印到控制台和屏幕。
  • 开始闻起来像 express 相关的东西,但从我读到的有关 express 的默认错误处理的内容中,您必须将 err 传递给 next(),我没有这样做。

标签: node.js exception express error-handling


【解决方案1】:

一个更简单的解决方法是为您的快速服务器添加一个中间件,带有 4 个参数,第一个参数是错误。这将覆盖 finalhandler 处理程序。

app.use((err, req, res, next) => {
  // Similar to uncaughtException handler
  // Log error, maybe send it to central server
  // Send Custom Log message maybe?
  return res.send('Nice server error to user');
}

您还应该保留 process.on('uncaughtException', fn); 以处理 http 请求响应管道之外的任何未捕获的异常。

【讨论】:

    【解决方案2】:

    弄清楚它是什么。出于某种原因,express 决定为我处理我的错误。

    67 线上的这个文件/node_modules/finalhandler/index.js 中,它们基本上处理了所有未处理的错误,这使得 uncaughtErrors 不会冒泡到堆栈的顶部......或下降到底部。不太确定这东西朝哪个方向.. :D

    我在该文件中添加了一行,错误开始通过我的异常处理程序:

    66     // unhandled error
    67     if (err) {
    68         throw err; //my line
    

    我不确定知道这一点我将如何前进,因为我不想覆盖核心功能,但我现在拥有知识。

    更新:在使用 finalhandler 和 express 打开票证后,我得到了一些关于如何覆盖默认功能的信息。

    我开的票是:

    https://github.com/pillarjs/finalhandler/issues/6 https://github.com/strongloop/express/issues/2707

    基本上,如果您将应用对象包装在一个新的 http 服务器中,您可以使用您自己的 final 函数覆盖最后一个事件。

    var express = require('express')
    var http = require('http')
    
    var app = express()
    
    // declare things on app
    
    var server = http.createServer(function (req, res) {
      app(req, res, function (err) {
        // this is your replacement for finalhandler
      })
    })
    
    server.listen(3000)
    

    【讨论】:

    • 那是和快递不同的包裹。
    • 是的。 finalhandler 在 express 中用作其事件链中的最终函数。我会用更多细节更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 2023-02-06
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    相关资源
    最近更新 更多