2008-12-04 7 views
31

Je cherche à enregistrer des exceptions javascript non gérées. Y a-t-il un événement qui se déclenche lorsqu'une exception n'est pas détectée? Je cherche à attraper les exceptions avant qu'elles provoquent des erreurs de javascript dans le navigateur, mais je préfère ne pas exécuter mon application entière dans un try/catch. Toute aide serait appréciée. Merci!Est-ce que Javascript déclenche un événement pour les exceptions non gérées/non interceptées?

Mise à jour: tvanfosson a souligné l'existence d'une erreur. Il ne fait pas partie d'une spécification et n'est disponible que dans les navigateurs basés sur IE ou Gecko.

Pour plus d'informations - http://books.google.com/books?id=tKszhx-XkzYC&pg=PA386&lpg=PA386&dq=safari+onerror+javascript&source=web&ots=gQaGbpUnjG&sig=iBCtOQs0aH_EAzSbWlGa9v5flyo#PPA387,M1

OnError soutien Table - http://www.quirksmode.org/dom/events/error.html

documentation de Mozilla - https://developer.mozilla.org/en/DOM/window.onerror

WebKit Bug Report - https://bugs.webkit.org/show_bug.cgi?id=8519

Répondre

8

Essayez d'utiliser un gestionnaire onerror. Docs de MDN. Cela vous permettra de faire quelque chose quand une erreur est détectée, mais ne vous laissera probablement pas continuer de manière gracieuse qu'un bloc try/catch le ferait. Sachez qu'il existe sans aucun doute des différences entre les navigateurs dans la façon dont cela est géré.

+0

Merci - cela semble fonctionner correctement –

+6

Voici un avertissement standard contre l'utilisation de w3schools.com comme référence. Voir http://www.w3fools.com pour plus d'informations. – L0j1k

+5

@ L0j1k Je ne l'utilise généralement pas en tant que ressource, mais il est intéressant de noter que même w3fools.com a constaté qu'ils s'étaient améliorés. «W3Schools a toujours des problèmes mais ils ont au moins travaillé sur la principale préoccupation des développeurs: pour de nombreux débutants, W3Schools propose des didacticiels structurés et des terrains de jeux qui offrent une expérience d'apprentissage décente, mais ce serait une erreur de poursuivre ses études. sources fiables, alors quand vous êtes prêt à monter de niveau, passez à autre chose. " – tvanfosson

32

Vérifiez ce Fiddle:

http://jsfiddle.net/xYsRA/1/

window.onerror = function (msg, url, line) { 
    console.log("Caught[via window.onerror]: '" + msg + "' from " + url + ":" + line); 
    return true; // same as preventDefault 
}; 

window.addEventListener('error', function (evt) { 
    console.log("Caught[via 'error' event]: '" + evt.message + "' from " + evt.filename + ":" + evt.lineno); 
    console.log(evt); // has srcElement/target/etc 
    evt.preventDefault(); 
}); 


throw new Error("Hewwo world. I crash you!!!"); 

throw new Error("Hewwo world. I can only crash you once... :("); 

qui imprime:

Caught[via window.onerror]: 'Uncaught Error: Hewwo world. I crash you!!!' from http://fiddle.jshell.net/xYsRA/1/show/:32 fiddle.jshell.net:21 
Caught[via 'error' event]: 'Uncaught Error: Hewwo world. I crash you!!!' from http://fiddle.jshell.net/xYsRA/1/show/:32 fiddle.jshell.net:26 
ErrorEvent {lineno: 32, filename: "http://fiddle.jshell.net/xYsRA/1/show/", message: "Uncaught Error: Hewwo world. I crash you!!!", clipboardData: undefined, cancelBubble: false…} 
fiddle.jshell.net:27\ 

Notes:

  • Si vous supprimez le "return true"/" evt.preventDefault() " lignes, puis après l'erreur est enregistré, il imprimera sur la console JS de la manière normale. Contrairement aux instructions ci-dessus, window.onerror a fonctionné dans tous les navigateurs que j'ai testés. Cependant, la méthode addEventListener est probablement meilleure de toute façon et fournit une sémantique plus riche.