我已经使用 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 有什么方法可以区分最初抛出的错误和通过回调错误产生的错误。似乎我被困在处理所有事情或什么都不处理。任何人都可以建议一种从可怕到糟糕的方法吗?