См. блок try / catch, не перехватывающий ошибку async / await , для получения дополнительного контекста, но чтобы ответить на ваш вопрос о том, как отловить ошибку в un -обещанная версия, вы должны понимать стек вызовов при возникновении ошибки.
У вас было
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
когда-либо throw (см. https://github.com/caolan/async/blob/master/lib/auto.js),, но https://github.com/ks3sdk/ks3-nodejs-sdk/blob/master/lib/api/download.js делает throw, если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
не удаляет файл конфигурации, если есть ошибка и есть обратный вызов.