为什么多个异常会破坏Node v12的异步堆栈跟踪?

时间:2019-08-02 03:09:23

标签: javascript node.js asynchronous v8

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)

为什么不是所有的异常都具有完整的堆栈跟踪?

0 个答案:

没有答案