2

我已经使用 node 几个月了。对于异步代码中的错误处理,我一直在遵循我所知道的最佳实践,即通过回调错误参数处理错误,并让大多数异常冒泡并使应用程序崩溃,因为实际上并没有一种干净地恢复的方法。

我现在正在与使用Q的开发人员一起开发一个项目,他正在使用 Q.nfbind 使用包装器调用我的一些基于回调的函数。但是,这让我对错误处理感到头疼。例如,假设我有一个可以回调错误的函数:

function doSomething(x, callback) {
    dbpool.acquire(function(err, conn) {
        if (err) return callback(err);

        conn.query('INSERT INTO some_table (x) VALUES (?)', [x],
        function(err, result) {
            dbpool.release(conn);
            if (err) return callback(err);
            callback(null, result.insertId);
        });
}
var qDoSomething = Q.nfbind(doSomething);

使用 QI 然后可以调用 qDoSomething 并处理错误 ok:

qDoSomething('abc')
.fail(function(err) {
     ...
});

现在假设我一晚工作得太晚,并在查询之前在我的 doSomething() 函数中签入了这样的代码:

var foo;
foo.doAnotherThing();

在我的 Q 之前的世界里,这会很糟糕。将引发异常,这将导致应用程序崩溃,并且它将永远重启。但是,一旦应用程序重新启动,它至少可以正常工作,直到再次点击此代码路径。但是,使用 Q,这个异常现在被失败处理程序捕获和处理。此处理程序无法修复损坏,因为它对连接池一无所知。现在,每次命中此代码路径时,都会从池中泄漏一个连接,最终应用程序被阻塞。这个错误的影响从坏到可怕。

我不知道 Q 有什么方法可以区分最初抛出的错误和通过回调错误产生的错误。似乎我被困在处理所有事情或什么都不处理。任何人都可以建议一种从可怕到糟糕的方法吗?

4

1 回答 1

1

子类化Error来包装那些err's 怎么样?

var MyError = function() {
  Error.apply(this, arguments);
};

var generateError = function(callback) {
  callback(new MyError('some reason'));
};
var doSomething = q.nfbind(generateError);

doSomething()
  .fail(function(e) {
    console.log('Was this a MyError instance?', e instanceof MyError);
  });
于 2013-02-21T15:13:36.097 回答