2009-03-14 6 views
8

Actualmente estoy trabajando en una aplicación web, tengo un mecanismo de registro JS que maneja el error Javascript que no son detectados por el código js dentro de la página. Estoy usando window.onerror para detectar todos esos errores y registrarlos en otro lugar.Ventana mímica. onerror en Opera usando javascript

Sin embargo, el problema es con Opera que no tiene el evento window.onerror. Un enfoque en el que podría pensar es, procesar en cadena todo el código de funciones js e insertar bloques de captura de prueba dentro de esas funciones después de la carga del cuerpo. Sin embargo, en muchos casos no funciona, pero al menos funciona en cierta medida.

Estoy seguro de que este enfoque apesta, pero no se me ocurre nada mejor. por favor asesorar.

Actualización: Por ahora, estoy llamando al código siguiente para capturar tantos errores como pueda.

function OnBodyLoad() 
{ 
     var allElements = document.getElementsByTagName("*"); 
     for(var cnt = 0;cnt < allElements.length;cnt++) 
     { 
      RegisterAllEvents(allElements[cnt]); 
     } 
} 
function RegisterAllEvents(objToProcess){ 
    for(var cnt = 0;cnt < objToProcess.attributes.length;cnt++){ 
     if(IsAttributeAnEvent(objToProcess.attributes[cnt].name)) 
     { 
      objToProcess.attributes[cnt].value = 'try{'+objToProcess.attributes[cnt].value+'}catch(err){LogError("'+ objToProcess.id+'"'+ ',err);}'; 
     } 
    } 
} 
+1

¡Gracias por el código! Podríamos terminar usando eso en modo de desarrollo en nuestra compañía (si no es demasiado lento). –

Respuesta

2

Esto también ocurre en Safari, AFAIK.

Lo que ciertamente se podría hacer es crear un bloque try/catch global para todo el código JS en lugar de análisis de texto - que podría ser difícil si usted entra en cosas como:

(function ($){ 
    $(function(){ 
    }); 
})(jQuery); 
+0

¿Estás diciendo que algo así funcionará? No lo hizo: try { function CauseError() { // hace algo para lanzar el error document.getElementById ('hjsdfkas'). Yeye = 'yyryr'; alerta ('prueba'); } } catch (e) { alerta ('se ha producido un error'); } – kalyang

+0

Sí, eso debería funcionar :) – Seb

+0

+1 para que ocurra en Safari también. – scunliffe

9

Opera 11.60+ apoya window.onerror.

Opera Dragonfly admite remote debugging. Es posible que pueda hack it (está todo escrito en JavaScript) y registrar los errores usted mismo (lamentablemente el protocolo isn't published yet).

+0

+1 para el archivo de un error con Opera. 'window.onerror' se definió en JavaScript 1.1 (hace más de una década) – scunliffe

+1

Es una limitación conocida, no se requiere informe de errores. – hallvors

+0

** Opera 11.60 ** lo admite, también. – c69

5

puede reemplazar Error.prototype.toString en Opera!

window.onerror = function (msg) { 
    // send msg to http://errors.net/log.php, for example 
    (new Image()).src = 'http://errors.net/log.php?msg=' + encodeURIComponent(msg); 
}; 
if (({}).toString.call(window.opera) === '[object Opera]') { 
(function() { 
    var x = Error.prototype.toString; 
    Error.prototype.toString = function() { 
    var msg = ''; 
    try { 
     msg = x.apply(this, arguments); 
     if (typeof (window.onerror) === "function") { 
     window.onerror(msg, typeof (this) === 'object' ? this.stack : '', ''); 
     } 
    } catch (e) {} 
    return msg; 
    }; 
}()); 
} 

parece, no funciona para Opera 11.50 ... sólo para las primeras versiones ...

Cuestiones relacionadas