aobako.net
async/await のエラーハンドリングを整理する
February 07, 2021
最近、しっかりと TypeScript を触る必要性が出てきて、非同期処理のエラーハンドリングまわりがうろ覚えになっていたので復習しておく。
const f = p => new Promise((resolve, reject) => {
if (p === 1) resolve('resolve!!')
else if (p === 2) reject('reject!!')
else throw new Error('throw!!')
})
f(1).then(r => console.log(r)).catch(r => console.log(`catch:: ${r}`)) // resolve!!
f(2).then(r => console.log(r)).catch(r => console.log(`catch:: ${r}`)) // catch:: reject!!
f(0).then(r => console.log(r)).catch(r => console.log(`catch:: ${r}`)) // catch:: Error: throw!!
;(async () => {
console.log(await f(1).catch(e => `catch:: ${e}`)) // resolve!!
console.log(await f(2).catch(e => `catch:: ${e}`)) // catch:: reject!!
console.log(await f(0).catch(e => `catch:: ${e}`)) // catch:: Error: throw!!
try {
await f(2)
} catch (e) {
console.log(`catch:: ${e}`) // catch:: reject!!
}
try {
await f(0)
} catch (e) {
console.log(`catch:: ${e}`) // catch:: Error: throw!!
}
})()
関数 f は引数によって、 Resolve
/ Reject
/ Error
のいずれかが返るようになっている。
Promise を then
/ catch
で受けとる形式はお馴染で、Promise が Resolve された場合にその戻り値を then
で受け取ることができ、 Reject または Error が throw された 場合は catch
で補足することができる。
async / await は非同期処理を同期的に書くことができるが、async な関数の戻り値は結局解決された Promise なので、そのまま受けとることができる。Reject された値、もしくは Error は try/catch で拾うか、Promise 同様、 catch
で拾うことができる。