使用Q处理exception的node.js
我一直在使用节点几个月。 对于asynchronous代码中的error handling,我一直遵循我所知道的最佳实践 ,即通过callback错误参数来处理错误,并让大多数exception冒出来并使应用程序崩溃,因为没有真正的一个干净的恢复方式。
我现在正在和一个使用Q的开发人员一起工作,他正在使用Q.nfbind来调用一些基于callback的函数。 但是,这给我头痛的error handling。 例如,假设我有一个可以callback的错误的函数:
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并处理错误确定:
qDoSomething('abc') .fail(function(err) { ... });
现在假设我工作得太晚了一晚,并且在查询之前在我的doSomething()函数中检查了这样的代码:
var foo; foo.doAnotherThing();
在我的前Q世界,这将是不好的。 将抛出exception,这将导致应用程序崩溃,并将永远重新启动。 但是,一旦应用程序重新启动,它将至less有效,直到此代码path再次被击中。 但是,使用Q,这个exception现在被捕获并由失败处理程序处理。 这个处理程序不能修复损坏,因为它对连接池一无所知。 现在,每当这个代码path被击中时,一个连接就会从池中泄漏出来,并最终导致应用程序被堵塞。 这个bug的影响只是从糟糕到糟糕。
我不知道用Q来区分最初抛出的错误和通过callback错误产生的错误。 看起来我被困在处理一切或没有。 任何人都可以提出一个方法来从可怕的坏回来?
如何子类Error
包装这些err
的?
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); });
- 在基于express.js的应用程序中集中error handling
- Nodejs / Express – 错误:发送后无法设置标头
- 如何处理node.js中的所有exception
- Express 4 / Node JS – 非常好地pipe理uncaughtException
- Mongk:带有Monk的Mongo数据库:错误捕获和处理,如果数据库closures
- 为什么NodeJS / restify服务器*很less*报EPERM接受?
- node.js中的readFileSyncerror handling
- nodejs使用的Error构造函数的参数是什么?
- 如何确保Node.js在MonogDB连接断开后继续运行?