В свежем выпуске подкаста напомнил соведущим, что
Как мы много узнали про ошибки и исключения в тот момент, когда TS 4.4 переключил
На самом деле V8 даёт несколько довольно интересных механизмов по работе с трейсами. Например, можно увеличить глубину стектрейса через
Ещё из интересного — так как остальные движки представляют стек просто как строку, то V8 решил не ломать это поведение, но даёт нам доступ к методу
Подробнее в блоге V8
error.stack
это не стандарт. Тут же Лёша отыскал пропозал по Error.prototype.stack. TS вот согласен, поля stack
в объекте Error
может и не быть:
interface Error {
name: string;
message: string;
stack?: string;
}
Как мы много узнали про ошибки и исключения в тот момент, когда TS 4.4 переключил
catch(e)
из any
в unknown
:) Пришлось разбираться и вспоминать, что в исключении может лететь не ошибка, а что угодно, например строка ( throw 'Oops'
). Набор полей там неизвестен, обработчики исключений необходимо писать, чтобы они сами не падали в исключения (а я встречал и такое).На самом деле V8 даёт несколько довольно интересных механизмов по работе с трейсами. Например, можно увеличить глубину стектрейса через
Error.stackTraceLimit
или через флаг v8 --stack-trace-limit
. Ещё из интересного — так как остальные движки представляют стек просто как строку, то V8 решил не ломать это поведение, но даёт нам доступ к методу
Error.prepareStackTrace(error, structuredStackTrace)
который вызывается в момент обращения к свойству stack
. И вот тут уже внутри метода можно работать с нормальным объектом structuredStackTrace
и переписать весь вывод так, как нам нравится. Но опять же, напомню, что только в V8.Подробнее в блоге V8