2011-08-17 18 views
42

Javascript tiene esta gran devolución de llamada window.onerror. Es bastante conveniente rastrear cualquier error. Sin embargo, llama con el nombre del error, el nombre del archivo y la línea. Ciertamente no es tan rico como obtener el objeto de error real de una declaración try...catch. El objeto de error real contiene muchos más datos, así que estoy tratando de conseguirlo. Desafortunadamente, la instrucción try...catch no funciona bien cuando comienza a tener un código asincrónico.Obtenga el objeto de error de Javascript real con window.onerror

¿Hay alguna manera de combinar y obtener lo mejor de ambos mundos? Inicialmente busqué la forma de obtener el último error activado dentro de un bloque onerror, pero parece que JS no almacena eso.

¿Alguna pista?

+0

para coger error anula las funciones como setTimeout y setInveral y poner un bucle intento de captura en el interior ellos. Podrás detectar todos los errores. Tener sentido ? –

Respuesta

10

Si se está refiriendo a la pila de rastreo del objeto de error, entonces AFAIK, esto no es posible.

La razón simple es que un seguimiento de pila está relacionado con un contexto de ejecución en el que se crearon o lanzaron excepciones de tiempo de ejecución (con try ... catch ... finally) (con new Error() o throw).

Considerando que cuando se invoca window.onerror, se llama dentro de un contexto diferente.

Puede obtener un poco de kilometraje inspeccionando window.event (no disponible en FF) en su controlador onerror.

+3

Dang. El rastro de la pila es en realidad una de las cosas que estoy buscando:/No estoy seguro de entender por qué esto no podría "persistir" de alguna manera, ya que es una serie de cadenas ... –

+0

No persiste porque el alcance en que fue creado ya no está allí. En caso de try/catch, aún estás en _that_ scope. – Mrchief

+1

Eche un vistazo a esto: http: //helephant.com/2007/05/12/diy-javascript-stack-trace/ Puede ser útil en su caso, aunque no estoy seguro. – Mrchief

46

esto ahora es posible en algunos navegadores. Se actualizó el spec para incluir el error real con stacktrace como el quinto parámetro.

el problema es que no todos los navegadores soporta esto todavía, por lo que podría hacer algo como esto:

window.onerror = function(message, filename, lineno, colno, error) 
{ 
    if(error != null) 
    { 
     //handle the error with stacktrace in error.stack 
    } 
    else 
    { 
     //sadly only 'message', 'filename' and 'lineno' work here 
    } 
}; 
+0

¿habría una buena manera de pasar este error a un servicio angular.js que está contenido en una aplicación ng? – FutuToad

+4

funciona al menos en Chrome, IE11 y Firefox> = 31. Todavía no he probado Safari ni las versiones móviles. Parece estar bastante bien soportado ahora. – frank

+0

@ user2151819 buenas noticias – SuperUberDuper

5

navegadores modernos soportan plenamente el proyecto de especificación HTML 5 para ErrorEvent y window.onerror. En ambos de estos navegadores También se puede usar window.onerror, o (sorprendentemente!) Se unen al evento 'error' correctamente:

// Only Chrome & Opera pass the error object. 
window.onerror = function (message, file, line, col, error) { 
    console.log(message, "from", error.stack); 
}; 
// Only Chrome & Opera have an error attribute on the event. 
window.addEventListener("error", function (e) { 
    console.log(e.error.message, "from", e.error.stack); 
}); 
Cuestiones relacionadas