Frage

Ich bin derzeit auf einer Web-Anwendung arbeiten, habe ich einen JS Logging-Mechanismus, der Javascript-Fehler behandelt, die nicht durch den js Code innerhalb der Seite gefangen werden. Ich verwende window.onerror alle solche Fehler zu fangen, und melden sie sonst wo.

Allerdings Problem ist mit Opera, die nicht window.onerror Ereignis hat. ein Ansatz, den ich aus einfiel, bespannen Prozess alle JS-Code Funktionen und Try-Catch-Blöcke innerhalb dieser Funktionen nach Körperlast ein. Es ist nicht, obwohl in vielen Fällen arbeiten, aber es zumindest zu einem gewissen Grad funktioniert.

Ich bin sicher, dass dieser Ansatz saugt, aber ich könnte mir nichts besser. Bitte beraten.

Update:. Denn jetzt bin ich den Code unten Aufruf so viele Fehler wie ich konnte Catch

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);}';
        }
    }
}
War es hilfreich?

Lösung

Dies geschieht auch auf Safari, AFAIK.

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

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

Andere Tipps

Opera 11.60+ unterstützt window.onerror.

Opera Libelle unterstützt Remote-Debugging . Sie könnten in der Lage sein, es hacken (alles in JavaScript geschrieben ist) und log Fehler selbst (leider das Protokoll ist noch nicht veröffentlicht ).

Sie können 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, es funktioniert nicht für Opera 11.50 ... nur für frühe Versionen ...

gibt es eine Erwähnung hier, dass Opera jetzt window.onerror unterstützt:

http://my.opera.com/ODIN/blog/2011/11/07/what-s-new-in-opera-development-snapshots-4-november-2011-edition

aber window.onerror scheint nicht in Opera Mini zu arbeiten (zB User-Agent "Opera / 9.80 (J2ME / MIDP; Opera Mini / 7.1.32422 / 30,3214; U; en) Presto / 2.8.119 Version / 11.10" ). Dies macht es wirklich schwer, Javascript zu debuggen auf Handys mit Opera Mini.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top