gpt4 book ai didi

node.js - 为什么我的 try catch block 没有捕获我的 Promise.promisifyAll 对象抛出的 fs.renameSync 异常

转载 作者:行者123 更新时间:2023-12-03 08:22:10 25 4
gpt4 key购买 nike

代码非常简单。 ks3 is a library别人开发的。它具有下载文件的启动功能。它使用 async.auto要做到这一点。
我用 Bluebird 包裹它Promise.promisifyAll

let ks3p = Promise.promisifyAll(ks3) //ks3 has a start function
try {
await ks3p.startAsync(param)
} catch (err) {
//failed to catch fs.renameSync
}

但有时我会收到错误
fs.js:115
throw err;
^
Error: ENOENT: no such file or directory, rename ... -> ...
at Object.renameSync (fs.js:591:3)

那么为什么 try catch block 没有捕捉到呢?

我进一步检查了 the start() implementation .它使用 async下载文件,但没什么特别的。
async.auto({
step_1 : ...
step_2 : ...
},
function(err, results) {
if (err) {
if (cb) {
cb(err, results)
} else {
fs.unlinkSync(configFile);
throw err;
}
} else {
fs.unlinkSync(configFile);
fs.renameSync(downFileName, filePath);
if (cb) {
cb(err, {msg:'success',path:filePath}, null);
}
}
})

- - - 更新 - - - -

我用 Promise.promisifyAll 包装的部分原因是我不知道如何捕获该错误。我的原始代码是这样的
ks3.download.start(param, (err, result) => {
//But how do I catch the exception start throw asynchronously ?
if (err) {
// error handling
} else {
log(`finished download ${file}`)
}
done()
})

------ 更新2 --------

在进一步挖掘问题后(答案很有帮助),我发现要么我修改了 ks3 代码,要么我将不得不使用域来捕获异常。我知道 domain is deprecated .但是对于这个特定的问题,我发现它是合适的 b/c 我确切地知道是什么导致了问题,而且我目前也没有解决这个问题(b/c 它是一个我无法控制的 npm 模块)。

最佳答案

try/catch block not catching async/await error对于一些额外的上下文,但要回答您关于如何捕获 中的错误的问题联合国 -promisified 版本,您必须了解抛出错误时的调用堆栈。

你有过

ks3.download.start(param, (err, result) => {
//But how do I catch the exception start throw asynchronously ?
if (err) {
// error handling
} else {
log(`finished download ${file}`)
}
done()
})

您应该将其视为:
var cb = (err, result) => {
//But how do I catch the exception start throw asynchronously ?
if (err) {
// error handling
} else {
log(`finished download ${file}`)
}
done()
});

ks3.download.start(param, cb);

它是 start本身引发异常(在它开始调用或安排回调之前),因此您需要将该调用包装在 try-catch 中:
var cb = (err, result) => {
//But how do I catch the exception start throw asynchronously ?
if (err) {
// error handling
} else {
log(`finished download ${file}`)
}
done()
});

try {
ks3.download.start(param, cb);
} catch (ex) {
// here.
}

我有点怀疑 async.auto不过,它的异常处理,我担心它可能会运行一些异步抛出的东西而不会捕获错误。特别是,它看起来不像期望 callback永远抛出的函数(见 https://github.com/caolan/async/blob/master/lib/auto.js ),但 https://github.com/ks3sdk/ks3-nodejs-sdk/blob/master/lib/api/download.js如果 fs 会抛出方法失败,就像你看到的那样。

因此,除了 a) 修复 ks3 之外,您无能为力。或者 b) 可能找到一种方法来对 fs 的版本进行猴子补丁。那 ks3看到永远不会扔。在这两者中,(a)对我来说听起来要容易得多,我认为它应该看起来像这样:
async.auto({
// ...
},
function(err, results) {
if (cb) {
if (err) {
cb(err);
return;
}
try {
fs.unlinkSync(configFile);
fs.renameSync(downFileName, filePath);
} catch (ex) {
cb(ex);
return;
}
cb(err, {msg:'success', path:filePath}, null);
} else {
// really, i wouldn't even bother fix this case and just make cb required.
}
})

最重要的是,我假设 ks3 是一个错误。如果有错误并且有回调,代码不会删除配置文件。

关于node.js - 为什么我的 try catch block 没有捕获我的 Promise.promisifyAll 对象抛出的 fs.renameSync 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53512775/

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