Как я могу повторно вызвать исключение в Javascript, но сохранить стек?

Предположим, в Javascript я хочу выполнить некоторую очистку при возникновении исключения, но пусть исключение продолжает распространяться вверх по стеку, например:

try {
  enterAwesomeMode();
  doRiskyStuff(); // might throw an exception
} catch (e) {
  leaveAwesomeMode();
  throw e;
}
doMoreStuff();
leaveAwesomeMode();

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

Как оказалось, try... наконец имеет то же поведение, по крайней мере, в Chrome (то есть это не повторный выброс именно в этом и заключается проблема, но наличие какого-либо блока обработчика исключений вообще.)

Кто-нибудь знает способ повторно вызвать исключение в Javascript, но сохранить связанную с ним трассировку стека? В противном случае как насчет предложений по другим способам добавления обработчиков очистки, безопасных для исключений, при одновременном захвате полных трассировок стека при возникновении исключения?

Спасибо за любые указатели :)

139
задан Anurag 17 September 2010 в 09:47
поделиться