前の投稿で「AsyncGenerator
使う方法」について紹介しました。その投稿では触れなかった、AsyncGenerator
の例外ハンドリングについてこの投稿では説明したいと思います。
AsyncGenerator
で例外が発生するとUnhandledPromiseRejectionWarning
になる
次のように、イテレーション中に例外が発生するケースがあるとします:
async function* numbers(): AsyncGenerator<number> {
yield 1
yield 2
await throwError()
yield 3
}
async function throwError() {
throw new Error('Something wrong')
}
このnumbers()
ジェネレータ関数をfor await
でループするコードは次のようになりますが、
async function main() {
for await (const number of numbers()) {
console.log(number)
}
}
main()
このコードをNode.jsでそのまま実行すると、throwError()
の行に到達したタイミングでUnhandledPromiseRejectionWarning
が発生してしまいます:
1
2
(node:11942) UnhandledPromiseRejectionWarning: Error: Something wrong
AsyncGenerator
で発生する例外をキャッチする方法
この例外をキャッチするには、for await
をtry-catch
で囲むことで例外をキャッチできるようになります:
async function main() {
try {
for await (const number of numbers()) {
console.log(number)
}
} catch (e) {
console.log(e.message)
}
}
実行結果:
1
2
Something wrong