Программно перехватывает трассировку стека Chrome Async Javascript - PullRequest
2 голосов
/ 14 мая 2019

Я пытался добавить лучшую регистрацию ошибок в веб-приложение, которое работает только в Chrome.По сути, я хочу иметь возможность записывать и хранить трассировки стека.Для синхронного кода это работает нормально, но для асинхронного кода я столкнулся с чем-то странным.По сути, Chrome регистрирует дополнительную информацию как часть его функции трассировки асинхронного стека, но я не смог выяснить, как ее перехватить.

Код для запуска в консоли браузера Chrome:

let e;
let a = () => Promise.resolve(null)
.then(() => (null).foo)
.catch(err => {
  console.info(err); 
  console.error(err); 
  e = err;
})
let b = () => a();
let c = () => b();
c();

Вывод:

(info)
TypeError: Cannot read property 'foo' of null
    at <anonymous>:3:20

(error, after expanding)
TypeError: Cannot read property 'foo' of null
    at <anonymous>:3:20
(anonymous) @ VM1963:6
Promise.catch (async)
a @ VM1963:4
b @ VM1963:9
c @ VM1963:10
(anonymous) @ VM1963:11

Итак, console.error дает мне трассировку стека, пронизанную до конца стека вызовов, предположительно, через некую магию движка Chrome.console.info дает мне фактическую трассировку стека, которая хранится в err.Если после того, как все это будет сделано, я попытаюсь прочитать значение e, его стек - это две строки, которые я получаю из оператора console.info, а не из оператора console.error.

Что я спрашиваюесть ли способ захватить и сохранить трассировку асинхронного стека, которую Chrome генерирует и использует при вызове console.error?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...