uncaughtException没有捕获抛出的错误

时间:2015-07-15 23:30:23

标签: node.js exception express error-handling

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

注意:此时我已经很好地阅读了有些人不喜欢这个功能的所有原因,所以请不要在这里发布这些问题。

我遇到的问题是:

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

但是以下内容并没有冒泡到我的uncaughtException函数:

throw new Redis_Exception('Some error here');

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

是否有一些理由认为以这种方式抛出的错误不会冒泡到应用程序进程的顶端?

2 个答案:

答案 0 :(得分:3)

更简单的方法是,使用带有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请求响应管道之外的任何未捕获的异常。

答案 1 :(得分:0)

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

/node_modules/finalhandler/index.js行上的67文件中,它们基本上处理了任何未处理的错误,这些错误可以防止未捕获的错误冒泡到堆栈的顶部......或者直到底部。不确定这个东西朝哪个方向..: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

基本上,如果您将app对象包装在新的http服务器中,则可以使用自己的最终功能覆盖最后一个事件。

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)