【发布时间】:2019-04-29 23:12:40
【问题描述】:
代码非常简单。 ks3 is a library 别人开发的。它具有下载文件的启动功能。它使用async.auto 来做到这一点。
我用蓝鸟包裹它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 块没有捕捉到呢?
我进一步检查了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 模块)。
【问题讨论】:
-
为什么,你在这里使用异步库?将普通的回调与 Promise 混合在一起真是一团糟。错误处理是一场噩梦(因此是你的问题)。
-
这是别人的代码(ks3.start 函数),我把它包装在 Promise.promisifyAll 中
-
但即使我没有用 Promise.promisifyAll 包装 ks3.start 并使用旧的 err 回调,我仍然不知道如何捕获该错误。
-
这里缺少太多代码。无法遵循代码中的控制流程。根本不知道
ks3p.startAsync()与async.auto()有什么关系。抱歉,这里没有足够的信息来了解这是在做什么或按照代码提供建议。另外,根本不知道ks3是什么。在我看来,您应该在回调函数中捕获错误,然后在出现错误时调用cb(err),但这只是一个疯狂的猜测,因为缺少很多代码。 -
抱歉给我带来了麻烦。我更新了我的问题,你能再检查一下吗?
标签: node.js error-handling promise try-catch bluebird