Прежде всего, нет никаких оснований для catch
и throw
или .catch()
и throw
, если вы не собираетесь делать что-то еще в обработчике перехвата или выдавать другую ошибку. Если вы просто хотите, чтобы была выдана та же ошибка, и больше ничего не делаете, то вы можете просто пропустить catch
или .catch()
и позволить исходному обещанию отклонить go обратно вызывающей стороне.
Тогда , как правило, не рекомендуется смешивать await
с .catch()
, поскольку за кодом не так просто следовать. Если вы хотите поймать исключение из await
, используйте try/catch
вокруг него. .catch()
работает, это просто не предпочтительный стиль, если вы уже await
обещаете.
Техническое различие * между этими двумя стилями:
async function someFunc()
let x = await fn().catch(err => {
console.log(err);
throw err;
});
// do something else with x
return something;
}
И это:
async function someFunc()
let x;
try {
x = await fn();
} catch(err) {
console.log(err);
throw err;
}
// do something else with x
return something;
}
, если функция fn()
вы вызываете throws синхронно (что не должно быть задумано, но может случайно), тогда опция try/catch
также поймает это синхронное исключение, а .catch()
- нет. Поскольку она находится в функции async
, функция async
будет перехватывать синхронное исключение и автоматически превращать его в отклоненное обещание для вызывающего абонента, чтобы оно воспринималось как отклоненное обещание, но оно не будет зарегистрировано или обработано в вашем .catch()
handler.
Один из наиболее выгодных случаев для try/catch
с await
- это когда у вас есть несколько операторов await
, и вам не нужно обрабатывать ошибки на любом из них в отдельности. Затем вы можете окружить их одним try/catch
и перехватить все ошибки в одном месте.
async function someFunc(someFile) {
let fileHandle;
try {
// three await statements in a row, all using same try/catch
fileHandle = await fsp.open(someFile);
let data = await fsp.read(...);
// modify data
await fsp.write(...)
} catch(err) {
// just log and re-throw
console.log(err);
throw err;
} finally {
// close file handle
if (fileHandle) {
await fileHandle.close();
}
}
}