368 votes

Traitement des erreurs globales en Javascript

Je voudrais attraper chaque erreur de fonction indéfinie lancée. Existe-t-il une fonction de traitement des erreurs globales en Javascript ? Le cas d'utilisation est d'attraper les appels de fonction de flash qui ne sont pas définis.

651voto

Sam Points 13570

Comment repérer les erreurs Javascript non gérées ?

Attribuer le window.onerror à un gestionnaire d'événement comme :

<script type="text/javascript">
window.onerror = function(msg, url, line, col, error) {
   // Note that col & error are new to the HTML 5 spec and may not be 
   // supported in every browser.  It worked for me in Chrome.
   var extra = !col ? '' : '\ncolumn: ' + col;
   extra += !error ? '' : '\nerror: ' + error;

   // You can view the information in an alert to see things working like this:
   alert("Error: " + msg + "\nurl: " + url + "\nline: " + line + extra);

   // TODO: Report this error via ajax so you can keep track
   //       of what pages have JS issues

   var suppressErrorAlert = true;
   // If you return true, then error alerts (like in older versions of 
   // Internet Explorer) will be suppressed.
   return suppressErrorAlert;
};
</script>

Comme commenté dans le code, si la valeur de retour de window.onerror est true alors le navigateur doit supprimer l'affichage d'une boîte de dialogue d'alerte.

Quand l'événement window.onerror se déclenche-t-il ?

En bref, l'événement est déclenché lorsque 1.) une exception non attrapée se produit ou 2.) une erreur de compilation se produit.

exceptions non prises

  • lancez "quelques messages".
  • call_something_undefined() ;
  • cross_origin_iframe.contentWindow.document ;, une exception de sécurité

erreur de compilation

  • <script>{</script>
  • <script>for(;)</script>
  • <script>"oops</script>
  • setTimeout("{", 10); il essaiera de compiler le premier argument en tant que un script

Navigateurs supportant window.onerror

  • Chrome 13+.
  • Firefox 6.0+.
  • Internet Explorer 5.5+.
  • Opera 11.60 et plus
  • Safari 5.1 et plus

Capture d'écran :

Exemple du code onerror ci-dessus en action après l'avoir ajouté à une page de test :

<script type="text/javascript">
call_something_undefined();
</script>

Javascript alert showing error information detailed by the window.onerror event

Références :

200voto

Ionuț G. Stan Points 62482

Cela vous aide-t-il ?

<script type="text/javascript">
window.onerror = function() {
    alert("Error caught");
};

xxx();
</script>

Je ne suis pas sûr de la façon dont il gère les erreurs de Flash...

Mise à jour : ça ne fonctionne pas dans Opera, mais je suis en train de pirater Dragonfly pour voir ce que ça donne. La suggestion de pirater Dragonfly vient de cette question :

http://stackoverflow.com/questions/645840/mimic-window-onerror-in-opera-using-javascript

40voto

SunnyRed Points 1543

Gestion sophistiquée des erreurs

Si votre gestion des erreurs est très sophistiquée et qu'elle risque donc de provoquer elle-même une erreur, il est utile d'ajouter un drapeau indiquant si vous êtes déjà en "errorHandling-Mode". Par exemple :

var appIsHandlingError = false;

window.onerror = function() {
    if (!appIsHandlingError) {
        appIsHandlingError = true;
        handleError();
    }
};

function handleError() {
    // graceful error handling
    // if successful: appIsHandlingError = false;
}

Sinon, vous pourriez vous retrouver dans une boucle infinie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X