nodejs函数中的域错误处理程序装饰器

时间:2015-03-05 00:31:24

标签: jquery node.js error-handling wrapper decorator

我正在尝试为我的节点js函数编写一个装饰器。像

这样的东西
'Test func a': custom_decorator( func(x)){
   ..
   ..
 ..
 })

我想说我想在我的函数中添加域错误处理程序,我想将域错误处理抽象到我的所有函数中。

var d = domain.create().on('error', function(err) {
  console.error(...);
});

d.enter();
  "My function"
d.exit()

我想将错误处理移动到装饰器,以便函数编写者可以使用

调用它
function_name : errorDecorator(fn)

1 个答案:

答案 0 :(得分:3)

一个例子:

function sum(a, b) { return a + b; }

function logDecorator(fn) {
  return function() {
    console.log(arguments);
    return fn.apply(this, arguments);
  };
}

var sumLog = logDecorator(sum);

sumLog(1, 10); // returns 11 and logs { '0': 1, '1': 10 } to the console
sumLog(5, 4); // returns 9 and logs { '0': 5, '1': 4 } to the console

其中:

  • arguments是一个类似于数组的对象,对应于传递给logDecorator的参数。
  • fn.apply调用具有给定this值的函数,并将参数作为数组(或类数组对象)提供。

<强>更新

另一个使用try-catch的例子:

function div(a, b) { 
  if(b == 0)
    throw new Error("Can't divide by zero.");
  else
    return a / b;
}

function logDecorator(fn) {
  return function() {
    try {
      console.log(arguments);
      return fn.apply(this, arguments);
    } catch(e) {
      console.error("An error occurred: " + e);
    }
  };
}

var divLog = logDecorator(div);

divLog(5, 2); // returns 2.5 and logs { '0': 5, '1': 2 } to the console
divLog(3, 0); // returns undefined, logs { '0': 3, '1': 0 }, and "An error occurred: Error: Can't divide by zero." to the console