Я пытался добавить лучшую регистрацию ошибок в веб-приложение, которое работает только в 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
?