Как я могу перекрыть исключение в 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");

и если вы используете код так же, как вы его написали, свойство стека не будет изменено при повторной ошибке.