Node v12已发布zero-cost async stack traces,可改善使用异步/等待时的堆栈跟踪。
但是,如果await
函数中有多个async
调用带有捕获的异常,则仅捕获的第一个异常将具有完整的堆栈跟踪。其他异常的堆栈从调用站点开始。
例如,请考虑以下情形:
async function a() {
await b();
}
async function b() {
try {
// OK - full stack trace
await c();
} catch (err) {
console.log(err);
}
try {
// Not OK - stack trace first frame is this line, previous frames lost
await c();
} catch (err) {
console.log(err);
}
}
async function c() {
throw new Error('whoops');
}
a();
运行以上输出:
Error: whoops
at c (test.js:64:9)
at b (test.js:40:11)
at a (test.js:34:9)
at Object.<anonymous> (test.js:66:1)
at Module._compile (internal/modules/cjs/loader.js:777:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:788:10)
at Module.load (internal/modules/cjs/loader.js:643:32)
at Function.Module._load (internal/modules/cjs/loader.js:556:12)
at Function.Module.runMain (internal/modules/cjs/loader.js:840:10)
at internal/main/run_main_module.js:17:11
Error: whoops
at c (test.js:64:9)
at b (test.js:45:11)
为什么不是所有的异常都具有完整的堆栈跟踪?