2009-03-14 11 views
8

Ich arbeite derzeit an einer Webanwendung, ich habe einen JS-Logging-Mechanismus, der Javascript-Fehler behandelt, die nicht durch den Js-Code innerhalb der Seite gefangen werden. Ich verwende window.onerror, um alle diese Fehler zu erfassen und sie wo sonst zu protokollieren.Mimisches Fenster. onerror in Opera mit Javascript

Problem ist jedoch mit Opera, die window.onerror Ereignis nicht hat. Eine Herangehensweise, an die ich denken könnte, ist, alle js-Funktionscodes mit einem String zu verarbeiten und try catch-Blöcke innerhalb dieser Funktionen nach dem Laden des Körpers einzufügen. Es funktioniert zwar in vielen Fällen nicht, aber es funktioniert zumindest teilweise.

Ich bin sicher, dass diese Herangehensweise saugt, aber ich konnte mir nichts besseres vorstellen. Bitte beraten.

Update: Im Moment rufe ich den Code unten, um so viele Fehler wie möglich zu fangen.

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

Danke für den Code! Wir könnten das im Entwicklungsmodus bei uns verwenden (wenn es nicht zu langsam ist). –

Antwort

2

Dies geschieht auch auf Safari, AFAIK.

Was konnte man sicherlich tun, ist eine globale try/catch-Block für alle JS-Code anstelle von Textanalyse erstellen - was schwierig sein könnte, wenn Sie in die Dinge kommen wie:

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

sagst du, dass so etwas funktioniert? Es tat nicht: Versuch { Funktion CauseError() { // tun etwas, um Fehler zu werfen document.getElementById ('hjsdfkas') yeye = 'yyryr'; Warnung ('Test'); } } catch (e) { Warnung ('ein Fehler ist aufgetreten'); } – kalyang

+0

Ja, das sollte funktionieren :) – Seb

+0

+1 für passiert auch in Safari. – scunliffe

9

Opera 11.60+ unterstützt window.onerror.

Opera Dragonfly unterstützt remote debugging. Sie können möglicherweise hack it (es ist alles in JavaScript geschrieben) und protokollieren Fehler selbst (leider das Protokoll isn't published yet).

+0

+1 für Datei einen Fehler mit Opera. 'window.onerror' wurde in JavaScript 1.1 (vor gut 10 Jahren) definiert. – scunliffe

+1

Es ist eine bekannte Einschränkung, kein Fehlerbericht erforderlich. – hallvors

+0

** Opera 11.60 ** unterstützt es auch. – c69

5

können Sie Error.prototype.toString in Opera ersetzen!

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; 
    }; 
}()); 
} 

scheint, ist es nicht für Opera 11.50 funktioniert ... nur für frühe Versionen ...