try provocar manejo lanzar excepciones excepcion errores error catch javascript exception exception-handling stack-trace callstack

manejo - provocar error javascript



¿Cómo puedo volver a lanzar una excepción en Javascript, pero conservar la pila? (2)

Este es un error en Chrome. Retirar una excepción debería preservar el seguimiento de llamadas.

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

No sé de ninguna solución.

No veo el problema con finalmente. Veo excepciones en silencio que no aparecen en la consola de error en algunos casos después de un final, pero que parece estar fijo en las compilaciones de desarrollo.

En Javascript, supongamos que quiero realizar una limpieza cuando ocurre una excepción, pero dejo que la excepción continúe propagándose en 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 atrapar y volver a lanzar la excepción hace que se pierda la información de seguimiento de la pila hasta ese punto, de modo que si la excepción se vuelve a capturar posteriormente, más arriba en la pila, el seguimiento de la pila solo se reduce a la -lanzar. Esto apesta porque significa que no contiene la función que arrojó la excepción.

Como resultado, intenta ... por fin tiene el mismo comportamiento, al menos en Chrome (es decir, no es el re-lanzamiento el problema exacto, sino la presencia de cualquier bloque controlador de excepción).

¿Alguien sabe de una manera de volver a lanzar una excepción en Javascript pero preservar el seguimiento de la pila asociado a ella? En su defecto, ¿qué hay de sugerencias para otras formas de agregar manejadores de limpieza seguros para excepciones, mientras que también captura rastros de pila completos cuando ocurre una excepción?

Gracias por cualquier puntero :)


La propiedad de pila de un objeto Error se crea al mismo tiempo que el objeto Error en sí mismo, no en el punto en que se lanza. A menudo son lo mismo debido a la expresión idiomática

throw new Error("message");

y si usa el código tal como lo escribió, la propiedad de la pila no cambiará cuando vuelva a generar el error.