gpt4 book ai didi

node.js 使用 Q 处理异常

转载 作者:太空宇宙 更新时间:2023-11-03 22:18:17 24 4
gpt4 key购买 nike

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

我现在正在与一位使用 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);

使用 Q,我可以调用 qDoSomething 并处理错误:

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

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

var foo;
foo.doAnotherThing();

在我的 Q 前世界里,这会很糟糕。会抛出异常,这会导致应用程序崩溃,并且会永远重新启动。但是,一旦应用程序重新启动,它至少会正常运行,直到再次点击此代码路径。然而,对于 Q,此异常现在由失败处理程序捕获并处理。该处理程序无法修复损坏,因为它对连接池一无所知。现在,每次点击此代码路径时,连接就会从池中泄漏,最终应用程序会变砖。这个错误的影响变得越来越糟糕。

我不知道如何使用 Q 来区分最初引发的错误和通过回调错误引发的错误。似乎我被困在处理所有事情或什么都不处理。谁能建议一种从糟糕状态恢复到糟糕状态的方法?

最佳答案

如何子类化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);
});

关于node.js 使用 Q 处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15005273/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com