【问题标题】:Strategies for handling exceptions between ticks (or, stacks) in Node.js? [duplicate]在 Node.js 中处理刻度(或堆栈)之间异常的策略? [复制]
【发布时间】:2013-07-27 05:25:30
【问题描述】:

我有以下内容:

var  http = require('http');

server = http.createServer(function(request, response) { 
  try {
    // Register a callback: this happens on a new stack on some later tick
    request.on('end', function() {
      throw new Error; // Not caught
    })

    throw new Error; // Caught below
  }
  catch (e) {
    // Handle logic
  }
}

现在,第一个Errortry...catch 捕获,但第二个Error 似乎没有被捕获。

几个问题:

  • 第二个Error 不会因为它出现在不同的堆栈上而被捕获吗?如果是这样,我是否理解 try...catch 行为不受词汇限制,而是取决于当前堆栈?我的解释正确吗?
  • 是否有任何经过充分探索的模式来处理此类问题?

【问题讨论】:

标签: javascript node.js


【解决方案1】:

您也可以使用简单的EventEmitter 来处理这种情况下的错误。

var http = require('http');
var EventEmitter = require("events").EventEmitter; 

server = http.createServer(function(request, response) { 
    var errorHandler = new EventEmitter;
    // Register a callback: this happens on a new stack on some later tick
    request.on('end', function() {
      if(someCondition) {
        errorHandler.emit("error", new Error("Something went terribly wrong"));
      }
    });

    errorHandler.on("error", function(err) {
      // tell me what the trouble is....
    });
});

【讨论】:

    【解决方案2】:

    第二个错误永远不会被抛出,也不会被捕获。在将匿名函数添加为 requestend 事件的处理程序之前,您会引发错误。

    即使你有,它也不会被抓住,因为它确实在不同的堆栈上。如果你想以这种方式工作,你必须引发一个错误事件,或者只是将错误作为第一个回调参数传递给任何回调函数。 (这些都是常见的约定,而不是强制规定。)

    【讨论】:

    • 我的错!我不是故意的。我更新了示例以在第一次抛出之前注册 CB。
    • 但是,是的,我喜欢这种事件处理方法。也许我会在早期创建一个错误调度程序,并从任何堆栈对该对象发出。这是有道理的,不是吗?
    【解决方案3】:

    catch 捕获在执行其try 块的内容时引发的错误。您的'end' 处理程序是在try 块内创建和分配的,但它显然不会在那里执行。它在request 触发其end 事件时执行,到那时try 块将被遗忘。

    您通常希望在事件处理程序中捕获错误,而不是让它们通过堆栈向上渗透。你永远不会/很少想扔掉它们。

    作为最后的手段,您可以在process 上为'uncaughtException' 注册一个处理程序,该处理程序将捕获其他地方未捕获的所有异常。但这很少是正确的解决方案。 http://nodejs.org/api/process.html#process_event_uncaughtexception

    【讨论】:

    猜你喜欢
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多