Как я могу перекрыть исключение в Javascript, но сохранить стек?
В Javascript предположим, что я хочу выполнить некоторую очистку, когда произойдет исключение, но пусть исключение продолжает распространяться по стеку, например:
try {
enterAwesomeMode();
doRiskyStuff(); // might throw an exception
} catch (e) {
leaveAwesomeMode();
throw e;
}
doMoreStuff();
leaveAwesomeMode();
Проблема с этим кодом заключается в том, что улавливание и повторное создание исключения приводит к тому, что информация трассировки стека до этой точки теряется, поэтому, если исключение впоследствии будет заимствовано снова, выше в стеке, трассировка стека только снижается к повторному броску. Это отстой, потому что это означает, что он не содержит функцию, которая фактически выбрала исключение.
Как оказалось, попробуйте. По сути, это то же самое поведение, по крайней мере, в Chrome (то есть, это не повторный бросок, это проблема точно, но наличие любого блока обработчика исключений вообще).
Кто-нибудь знает, как восстановить исключение в Javascript, но сохранить связанную с ним трассировку стека? В противном случае, как насчет предложений по другим способам добавления исключающих исключение обработчиков очистки, а также для захвата полных стековых следов при возникновении исключения?
Спасибо за любые указатели:)
Ответы
Ответ 1
Это ошибка в Chrome. Повторное создание исключения должно сохранять трассировку вызова.
http://code.google.com/p/chromium/issues/detail?id=60240
Я не знаю об обходном пути.
Я не вижу проблемы с окончанием. Я вижу исключения, которые в некоторых случаях молча появляются на консоли ошибок в конце концов, но, похоже, это исправлено в сборках разработки.
Ответ 2
Свойство стека объекта Error создается одновременно с самим объектом Error, а не в том месте, которое оно выбрасывает. Они часто одинаковы из-за идиомы
throw new Error("message");
и если вы используете код так же, как вы его написали, свойство стека не будет изменено при повторной ошибке.