2011-08-07 14 views
17

Deseo poder enviarme todos los errores de javascript en una página. Soy un desarrollador de extensión, por lo que lo siguiente hace hincapié en asegurarse de que el dom esté listo antes de realizar llamadas.Obtenga todos los errores de javascript en la página/javascript error handling

que investigaron la adición de algunas funciones a la throw también para enviar por correo o las excepciones, pero no encontré que esto sea posible.

1: principal solución a esto, un controlador window.onerror:

window.onerror = function(e, url, line){ 
    mailError('onerror: ' + e + ' URL:' + url + ' Line:' + line); 
    console.error('\nLine ' + line + ':'); 
    setTimeout(function(){retry();}, 100); //mainly useful in content scripts for extensions, 
    return true; 
} 

También puede ser necesario hacer lo mismo a través de jQuery:

$(window).error( 
    function(e, url, line){ 
    //handle error 
    } 
); 

La caída de esto es que su el código ha dejado de ejecutarse.

Para evitar errores al detener la ejecución, es mejor usar devoluciones de llamada para asegurarse de que el código se ejecuta en una secuencia determinada y para utilizar eventos siempre que sea posible. También puede proteger las llamadas dom con algunas técnicas

$(document).ready({ 
    //you usually won't get bad dom calls wrapping your code in this 
}); 

también se puede considerar que ejecutan código en window.onload

window.onload = function(){ 
    //you page will probably twitch upon executing code at this time 
    //but you will almost never have a bad dom call 
}; 

Otra técnica

if (document.getElementById('iNeedThisElement')) { 
    //doin work! 
    document.getElementById('iNeedThisElement').style.display = 'block'; 
} else { 
    var stillNeedToTakeCareOfX = true; //false otherwise since it's undefined 
    mailError('iNeedThisElement was unavailable...'); 
} 

El uso de estas técnicas y acaba de depuración de la aplicación, debe estar bastante bien. Desde console.error, .warn y .log declaraciones no pueden ser recuperados e informaron a su, se proporciona una pequeña suite alternativa a continuación:

var Xe = { }; //Extreme error suite 

function extraInfo(e){ 
    //e optional 
    if(!e)e = true; 

    //add an extra debug info, such as navigator or current URL 
    return ' currentURL: '+ document.URL + 
     '\n userAgent: ' + navigator.userAgent + 
     '\n platform: ' + navigator.platform + 
     '\n userid: ' + localStorage.userid + 
     '\n language: ' + navigator.langauge + 
     '\n cookies?: ' + navigator.cookiesEnabled; 
} 

Xe.error = function(e){ 
    console.error(e); //maintain original functionality 
    mailError('Xe err: ' + e + extraInfo()); 
} 


Xe.warn = function(e){ 
    console.warn(e); 
    mailError('Xe warn: ' + e + extraInfo()); 
} 


Xe.log = function(e){ 
    console.log(e); 
    mailError('Xe log: ' + e + extraInfo()); 
} 

Como último zanja, puede intentar continuamente para ejecutar un trozo de código hasta que se ejecuta sin errores. Esto es "2" a continuación.

2: código de grupo en trozos grandes y tratar de volver a ejecutar x segundos más tarde después de la captura de un error, o continuar a la siguiente trozo de código

//defExe = DEFinitely EXEcute this code 
    //functionArg, reference to a function holding a large chunk of code 
    //seconds, timeout in milliseconds to re-attempt error free execution of this function 
function defExe(functionArg, seconds) { 
    //seconds is optional 
    if (!seconds)seconds = 300; 

    try { 
    functionArg(); 
    } catch(e) { 
    //mail the error plus extra info 
    mailError('caught ' + e + ' attempting to re-execute ' + functionArg.name + ' in ' + seconds + ' milliseconds'); 

    //re-attempt to execute this code 
    setTimeout(function(){ 
     defExe(functionArg, seconds); 
    }, seconds); 
    } 
} 

esto se utiliza entonces como

//array to group function chunks 
var fn = [ ]; 

fn[1] = function(){ 
    //a large chunk of javascript 
} 
defExe(fn[1]); 

fn[2] = function(){ 
    //another chunk of your program 
} 
defExe(fn[2]); 

# 2 Resumen: Código de grupo en funciones y ejecutar en el bloque try-catch, repitiendo si se detectan errores

+0

¿Sabía que 'fn.1' es inválido synthax? Necesitas usar 'fn [1]'. – HoLyVieR

+0

Así que en realidad creo que he descubierto que lo que quiero hacer es usar el evento YUI disponible, disparado cuando "DOM responde a getElementById" http://developer.yahoo.com/yui/3/event/#onadisponible Ahora solo tengo que hacer una función doc.byId más competente que envuelve las llamadas dom en esta funcionalidad de código YUI. Sin embargo, podría perder un error y, por lo tanto, no descubrir el código que aún no se ejecutó. –

Respuesta

31

Tengo el mío trabajando con window.onerror y no detiene mi javascript:

window.onerror = function(error, url, line) { 
    controller.sendLog({acc:'error', data:'ERR:'+error+' URL:'+url+' L:'+line}); 
}; 

Tenga en cuenta que controller.sendLog es una función que envía estos datos a un registro de php.

¿Puede ser porque está causando algún error de javascript dentro de esa función?

+0

Conecté su código a una página simple y encontré que la ejecución se detuvo, ¿se encuentra en un entorno especial? Posiblemente el desarrollo de la extensión? –

+4

Bueno, se detendrá la ejecución del hilo actual, porque se produce un error, es el comportamiento normal en JavaScript. En la página que estoy usando esto, tengo muchos objetos y eventos activados aquí y allá, así que si uno se rompe, ese deja de ejecutarse, pero un nuevo evento que activa el mismo código vuelve a funcionar. Creo que no se puede evitar que se detenga, la única forma de hacerlo es usar muchos bloques try-catch, y también, en un bloque try-catch el comportamiento es el mismo, deja de ejecutar el bloque y salta al atrapar la oración –

+0

Acepté la respuesta de Sergi, ya que mostró el uso de los parámetros url y de línea que desconocía o usó por encima de –

2

Cuando se produce una excepción en la mayoría de los idiomas, la ejecución de la pila de comandos actual se detendrá. Por lo tanto, su enfoque global window.onerror funciona, pero no continúa ejecutando código después de una falla. Tengo curiosidad de por qué esperaría que un reintento funcione en caso de que falle la llamada original. Tal vez haya otra forma de optimizar su aplicación para evitar esto.

Una de las cosas que me gusta hacer es ajustar cualquiera de mis códigos en la función window.onerror en un bloque try catch. En la declaración de catch (último recurso) generalmente utilizaré una alerta de algún tipo, por si acaso algo falla catastróficamente. La idea aquí es que no quiere que el manejo de errores de la página ALGUNA VEZ acabe causando que se inicie otro error.

+0

Buen punto para esperar que el código tenga éxito más adelante. Supongo que el objetivo principal de esto era aislar trozos de código y obtener más errores devueltos por correo. La razón por la que espero que funcione más tarde es que, en el desarrollo de la extensión, a veces las secuencias de comandos de contenido se ejecutan demasiado rápido/temprano, por lo que esperar un poco permitiría que la página cargue más y cargue elementos DOM que no estaban previamente cargado. –

+0

Aparte de eso, puede terminar esperando que la red se vuelva a conectar –

0

Usted puede tratar también

Try ... Catch Declaración

try 
{ 
    //Run your code here 
} 
catch(err) 
{ 
    //Handle the errors here 
} 
+0

Esto no funcionará con los errores de la consola, a menos que sobrescriba la función de error para arrojar el error como una excepción en su lugar: 'console.error = error => {throw Error (error)}; 'aunque es una práctica bastante mala. –

3

Lo sentimos pero trate/catch capturará solamente errores de código, nunca se cargue de error (si falta un archivo o algo así).

window.onerror/$ (window) .error es definitivamente la mejor solución.

Cuestiones relacionadas