2009-03-14 7 views
8

Attualmente sto lavorando su un'applicazione web, ho un meccanismo di registrazione JS che gestisce l'errore Javascript che non viene catturato dal codice js all'interno della pagina. Sto usando window.onerror per catturare tutti questi errori e registrarli altrove.Finestra mimica. onerror in Opera usando javascript

Tuttavia, il problema è con Opera che non ha evento window.onerror. un approccio che potrei pensare è quello di stringere il codice di tutte le funzioni js e inserire i blocchi di cattura all'interno di quelle funzioni dopo il carico del corpo. Tuttavia, non funziona in molti casi, ma almeno funziona in una certa misura.

Sono sicuro che questo approccio fa schifo, ma non riuscivo a pensare a niente di meglio. Si prega di avvisare.

Aggiornamento: per ora, sto chiamando il codice qui sotto per catturare quanti più errori possibile.

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

Grazie per il codice! Potremmo finire per usarlo in modalità di sviluppo presso la nostra azienda (se non è troppo lento). –

risposta

2

Questo accade anche su Safari, AFAIK.

Cosa si potrebbe certamente fare è creare un blocco try/catch globale per tutto il codice JS, invece di analisi del testo - che potrebbe essere difficile se si entra in cose come:

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

stai dicendo che qualcosa del genere funzionerà? No: try { function CauseError() { // fare qualcosa per lanciare l'errore document.getElementById ('hjsdfkas'). Yeye = 'yyryr'; Avviso ('test'); } } allarme (e) { ('si è verificato un errore'); } – kalyang

+0

Sì, che dovrebbe funzionare :) – Seb

+0

+1 per succede anche in Safari. – scunliffe

9

Opera 11.60+ supporta window.onerror.

Opera Dragonfly supporta remote debugging. Potresti essere in grado di scrivere hack it (è tutto scritto in JavaScript) e registrare gli errori (sfortunatamente il protocollo isn't published yet).

+0

+1 per il bug di file con Opera. 'window.onerror' è stato definito in JavaScript 1.1 (ben oltre un decennio fa) – scunliffe

+1

È una limitazione nota, non è richiesto alcun rapporto bug. – hallvors

+0

** Opera 11.60 ** lo supporta anche. – c69

5

è possibile sostituire Error.prototype.toString in 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; 
    }; 
}()); 
} 

sembra, non funziona per Opera 11.50 ... solo per le prime versioni ...