¿Cómo puedo repensar una excepción en Javascript, pero preservar la pila?


En Javascript, supongamos que quiero realizar alguna limpieza cuando ocurre una excepción, pero que la excepción continúe propagándose por la pila, por ejemplo:

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

El problema con este código es que capturar y repensar la excepción hace que la información de seguimiento de la pila hasta ese punto se pierda, de modo que si la excepción es capturada posteriormente de nuevo, más arriba en la pila, el seguimiento de la pila solo desciende hasta el re-throw. Esto apesta porque significa que no contiene la función que en realidad lanzó la excepción.

Como resultado, inténtalo..finalmente tiene el mismo comportamiento, al menos en Chrome (es decir, no es el re-throw que es el problema precisamente, pero la presencia de cualquier bloque controlador de excepción en absoluto.)

¿Alguien conoce una forma de repensar una excepción en Javascript pero preservar el seguimiento de la pila asociado con ella? En su defecto, ¿qué tal sugerencias para otras formas de agregar manejadores de limpieza seguros para excepciones, mientras que también capturan trazas de pila completas cuando una excepción ocurre?

Gracias por cualquier sugerencia:)

Author: Anurag, 2010-09-17

2 answers

Este es un error en Chrome. Repensar una excepción debe preservar el seguimiento de la llamada.

Http://code.google.com/p/chromium/issues/detail?id=60240

No conozco ninguna solución.

No veo el problema con finalmente. Veo excepciones silenciosamente que no aparecen en la consola de errores en algunos casos después de un fin, pero ese parece estar arreglado en las compilaciones de desarrollo.

 65
Author: Glenn Maynard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-13 23:10:28

La propiedad stack de un objeto de error se crea al mismo tiempo que el objeto de Error en sí, no en el punto en que se lanza. A menudo son los mismos debido a la expresión

   throw new Error("message");

Y si usa el código tal como lo ha escrito, la propiedad stack no se cambiará cuando vuelva a generar el error.

 19
Author: Mike Stay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-06 15:00:08