在Node.js中处理ticks(或堆栈)之间exception的策略?

我有以下几点:

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行为不是词法绑定的,而是取决于当前的栈? 我解释正确吗?
  • 有没有什么好的模式来处理这类问题?

你也可以使用一个简单的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.... }); }); 

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

即使你有,它也不会被捕获,因为它确实在不同的堆栈上。 如果你想以这种方式工作,你必须引发一个错误事件,或者只是将错误作为第一个callbackparameter passing给任何callback函数。 (这些都是公约,而不是任务)。

catch catches执行try块内容时抛出的错误。 你的'end'处理程序是在try块内部创build和分配的,但显然不会在那里执行。 它在request触发end事件时执行,而try块将会很久以前被遗忘。

您通常会想要捕捉事件处理程序中的错误,而不是让它们在堆栈中渗透。 你永远不会/很less想扔他们。

作为最后的手段,你可以在process上注册一个处理程序'uncaughtException' ,它将捕获所有其他地方没有捕获到的exception。 但这很less是正确的解决scheme。 http://nodejs.org/api/process.html#process_event_uncaughtexception