Em Javascript, suponha que eu queira executar alguma limpeza quando uma exceção acontecer, mas deixe a exceção continuar propagando a pilha, por exemplo:
try {
enterAwesomeMode();
doRiskyStuff(); // might throw an exception
} catch (e) {
leaveAwesomeMode();
throw e;
}
doMoreStuff();
leaveAwesomeMode();
O problema com esse código é que capturar e repetir a exceção faz com que as informações de rastreamento de pilha sejam perdidas até esse ponto, de modo que, se a exceção for capturada novamente novamente, mais alto na pilha, o rastreamento de pilha será reduzido apenas para o re -lançar. Isso é péssimo porque significa que não contém a função que realmente lançou a exceção.
Como se vê, try..finally tem o mesmo comportamento, pelo menos no Chrome (ou seja, não é exatamente o relançamento que é o problema, mas a presença de qualquer bloco de manipulador de exceção).
Alguém sabe como refazer uma exceção em Javascript, mas preservar o rastreamento de pilha associado a ela? Na falta disso, que tal sugestões de outras maneiras de adicionar manipuladores de limpeza com exceção de segurança, além de capturar rastreamentos de pilha completos quando uma exceção acontece?
Obrigado por qualquer ponteiro :)