JavaScriptにおけるasync/await呼び出しのスタックトレースの困難と実装
SessionTrack BJapanese
お手元のChromeで以下のコードを実行してみてください!(もちろんしなくてもいいですよ)
async function foo(x) { await bar(x); }
async function bar(x) { await baz(x); }
async function baz(x) {
await x;
throw new Error("error from baz");
}
foo(3).catch(e => { console.log(e.stack); });
こんなスタックトレースが表示されたでしょう!
Error: error from baz
at baz (<anonymous>:9:11)
at async bar (<anonymous>:5:5)
at async foo (<anonymous>:2:5)
うんうん、当たり前ですね。...本当に当たり前ですか!?
実は、JSエンジンの側から見ると、このようなasync/awaitが連なった関数呼び出しの中でエラーが発生した時にちゃんとスタックトレースを作るのって難しいんです。 このセッションでは、実際にJSCでのこの機能の開発に関わっている経験から、なぜこのようなスタックトレースを生成するのが難しいのか、そしてJSエンジンはどのように対応しているのかについて解説します。
Sosuke Suzuki
Systems Engineer at Bun, WebKit reviewer