javascript - 异步 node.js 调用中的错误处理

标签 javascript exception-handling callback node.js

我是 node.js 的新手,虽然我对 JavaScript 非常熟悉。我的问题是关于如何处理 node.js 中的错误的“最佳实践”。

通常在以各种语言编写 Web 服务器、FastCGI 服务器或网页时,我会在多线程环境中使用带有阻塞处理程序的异常。当有请求进来时,我通常会这样做:

function handleRequest(request, response) {
  try {

    if (request.url=="whatever")
      handleWhateverRequest(request, response);
    else
      throw new Error("404 not found");

  } catch (e) {
    response.writeHead(500, {'Content-Type': 'text/plain'});
    response.end("Server error: "+e.message);
  }
}

function handleWhateverRequest(request, response) {
  if (something) 
    throw new Error("something bad happened");
  Response.end("OK");
}

这样我总是可以处理内部错误并向用户发送有效的响应。

我知道使用 node.js 应该进行非阻塞调用,这显然会导致各种数量的回调,就像在这个例子中一样:

var sys    = require('sys'),
    fs     = require('fs');

require("http").createServer(handleRequest).listen(8124);

function handleRequest(request, response) {

  fs.open("/proc/cpuinfo", "r",
    function(error, fd) {
      if (error)
        throw new Error("fs.open error: "+error.message);

      console.log("File open.");

      var buffer = new require('buffer').Buffer(10);
      fs.read(fd, buffer, 0, 10, null,
        function(error, bytesRead, buffer) {

          buffer.dontTryThisAtHome();  // causes exception

          response.end(buffer);
        }); //fs.read

    }); //fs.open

}

此示例将完全终止服务器,因为没有捕获异常。 我的问题在这里,我不能再使用单个 try/catch,因此通常无法捕获在处理请求期间可能引发的任何错误。

当然,我可以在每个回调中添加一个 try/catch,但我不喜欢这种方法,因为这取决于程序员是否忘记 try/catch。对于具有许多不同且复杂的处理程序的复杂服务器,这是 Not Acceptable 。

我可以使用全局异常处理程序(防止服务器完全崩溃),但是我无法向用户发送响应,因为我不知道哪个请求导致了异常。这也意味着请求保持未处理/打开状态,并且浏览器一直在等待响应。

有人有好的、坚如磐石的解决方案吗?

最佳答案

Node 0.8 引入了一个名为“域”的新概念。它们与 .net 中的 AppDomain 非常相似,并提供了一种封装一组 IO 操作的方式。它们基本上允许您将请求处理调用包装在特定于上下文的组中。如果该组抛出任何未捕获的异常,则可以通过使您能够访问所需的所有范围和上下文特定信息的方式对它们进行处理和处理,以便成功从错误中恢复(如果可能)。

此功能是新功能,刚刚引入,因此请谨慎使用,但据我所知,它是专门为解决 OP 试图解决的问题而引入的。

文档位于:http://nodejs.org/api/domain.html

关于javascript - 异步 node.js 调用中的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5816436/

相关文章:

java - 即使你抛出一个新的异常,finally block 是否也会运行?

JavaScript 回调/闭包/其他

java - 如何使用回调来实现 session 模式?

更改结构中定义的 int 值

javascript - getElementsByClass[index] 不起作用

javascript - 部分更新后如何在 ng-app 范围之外编译 html

javascript - 如何在 jQuery/javascript 中添加多个监听器?

javascript - 从嵌入式 Tableau 报告导出为 PDF 时,浏览器控制台中出现未经授权的错误

error-handling - 管道和错误处理

php - 如何使用 PHPUnit 对异常进行单元测试?