0

我在这个问题中找到了接受的答案来回答我遇到的错误处理问题。

但是请注意注释 - 需要完成 http.ServerResponse 以便应用程序最终不会耗尽内存 - 这是一个问题。

一个人将如何实现这样的东西呢?回调函数如何访问所述对象?

4

2 回答 2

1

正如这篇文章的答案中提到的那样——如果你有一个未捕获的异常,你最好的方法是让进程终止并从那里恢复——否则你不知道应用程序的当前状态是什么。

因为您没有捕获异常,所以它表明应用程序不知道发生了什么。为了解决这个问题 - 你设计你的应用程序在许多小块中,而不是在一个过程中。

这会对性能产生轻微影响(RPC 与进程内通信),但这意味着您可以轻松入睡,而小块出错,重新启动并且一切都很好,因为它们从不维护自己的状态(为此使用 Redis)......

如果您真的想在请求中捕获异常,然后在请求上调用 end() ,则必须使用可以访问响应的闭包,如下所示:

// a method that will catch an error and close the response
var runFunctionSafely = function(res, tryFunction){
  try{
    tryFunction();
  }
  catch(error){
    console.log('there was an error, closing the response...');
    console.log(error);
    res.end();
  }
}

app.get('/test', function(req, res, next) {
  runFunctionSafely(res, function(){
    throw new Error('this is a problem');
  })
});
于 2012-08-15T16:09:58.373 回答
1

'uncaughtException'处理程序无权访问响应对象,因此它无法结束响应。评论的假定点是,您不应该依赖'uncaughtException'所有错误处理需求,因为在许多情况下(如提到的情况),您不在正确处理错误的正确范围内。

于 2012-08-15T16:04:14.773 回答