100

En Javascript, supongamos que quiero para realizar alguna tarea de limpieza cuando una excepción que pase, ¡pero la excepción continúan propagando la pila, por ejemplo:¿Cómo puedo volver a lanzar una excepción en Javascript, pero conservar la pila?

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

El problema con este código es que la captura y Regeneración de las causas de excepción la información de seguimiento de la pila hasta ese punto se perderá, de modo que si la excepción se vuelve a capturar posteriormente, más arriba en la pila, el seguimiento de la pila solo desciende al reenvío. Esto apesta porque significa que no contiene la función que arrojó la excepción.

Como resultado, intente ... finalmente 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 excepciones).)

¿Alguien sabe de una manera de volver a lanzar una excepción en Javascript, pero conserva el seguimiento de 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 punteros :)

+7

0x3a28213a - esperando mi agradecimiento ;-) – bacar

+0

Dupe: https://stackoverflow.com/questions/5249960/javascript-rethrowing-an-exception-preserving-the-stack-trace – MatthewMartin

+0

Esta pregunta debería estar cerrada porque se refiere a un error de Chrome corregido en 2012. –

Respuesta

53

Esto 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 cualquier 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.

+13

Parece que este error ya se solucionó. – mzedeler

15

La propiedad de un objeto pila de errores se crean al mismo tiempo que el propio objeto de error, no en el punto que ha lanzado. A menudo son los mismos debido a la expresión idiomática

 
    throw new Error("message"); 

y si se utiliza el código de la misma manera que se ha escrito, la propiedad pila se no ser cambiados cuando volver a generar el error.

+1

Esto no es cierto (tal vez depende de la plataforma). El motor js que estoy usando ahora (Rhino) restablece la pila en la instrucción throw, perdiendo la pila original. –

+0

Quizás sea así, pero rhino-1.7.7.2.jar no lo cambia. Qué versión estás usando? –

Cuestiones relacionadas