2009-12-25 13 views
12

Estoy intentando registrar errores de JavaScript en un sitio productivo. Hasta ahora ha funcionado bastante bien con el siguiente código incluido en el sitio:errores de registro con seguimiento de pila en javascript

function catcherr(errorMessage, url, line) { 
    var parameters = "msg=" + escape(errorMessage) 
      + "&url=" + escape(url) 
      + "&line=" + escape(line); 

    new Image().src = "/error.gif?" + parameters; 

    return false; 
}; 

window.onerror = catcherr; 

Estoy intentando añadir un seguimiento de la pila de los errores para obtener más información. Esto, básicamente, funciona con la siguiente idea incluida en la función anterior:

try { i.dont.exist += 0; } // does not exist - that's the point 
    catch (e) 
    { 
      if (e.stack) // Firefox 
      { 
       // do some stuff 

utilizo jQuery, un ejemplo sencillo:

<script type="text/javascript"> 
jQuery(document).ready(function() { 
    p.foo += 1; // this should throw an error 
    // do stuff 
}); 
</script> 

La parte divertida es, que cuando tenga un error dentro de la "lista "función de jquery, la parte" try {i.dont.exist + = 0;} "ya no arroja ninguna excepción y el motor se detiene sin ningún error. Con el ejemplo anterior, y catcherr amplía del modo siguiente, sólo "1" consigue alertado:

function catcherr(errorMessage, url, line) { 
    try { alert(1); i.dont.exist += 0; alert(4);} catch(e) { alert(5);} 
    alert(2); 
    var parameters = "msg=" + escape(errorMessage) 
    // ... 
} 

Cualquier persona que tenga una idea de por qué esto se rompe, cuando se produce un error dentro de la función "listo" de jQuery?

Respuesta

1

Lo más probable es que jQuery esté envolviendo la devolución de llamada en su propio intento/captura e ignorando el error.

+0

No lo creo, ya que el error se produce si elimino el try {} en la función catcherr(). – 2ni

8

No sé por qué tienes ese problema (se ve muy extraño y no creo que sea un problema con JQuery comiendo tus excepciones, ya que tu alerta (1) no se habría disparado), pero lo hice quiero mencionar su uso de Error.stack: cuando se llama al evento onerror, no tiene el contexto de la pila del error original, por lo que obtener un seguimiento de la pila en ese punto (detectando su propio error) no generará una pila significativa .

Pero volvamos a una respuesta real: en lugar de simular un problema escribiendo un código específicamente roto para que pueda captar el error, ¿qué tal si lanzamos un error directamente? La primera línea en el controlador onerror podría ser:

try { throw new Error("dummy"); } catch (e) { alert(e.stack); } 

Este es un código válido que será más probable es que no le cause problemas.

0

Pruebe con una excepción diferente dentro del try/catch. como a = 1/0 o baddarr [5] = 'malo' y ver si esos desencadenan excepciones. En ocasiones, los errores de "Objeto no encontrado" pueden deberse a que los objetos aún no se han cargado y puede haber un manejo diferente para ellos que otras excepciones.

+0

no, no hay cambio – 2ni

+0

no estoy seguro, entonces. muy desconcertante. ¿Has mirado el manejo de excepciones dentro de los archivos de jQuery? – funkymushroom

Cuestiones relacionadas