Quelles sont les meilleures pratiques pour la gestion des erreurs JavaScript?

Je cherche à commencer à faire de mon JavaScript un peu plus de preuve d'erreur, et je trouve beaucoup de documentation sur l'utilisation d' try , de catch , finally , de throw , mais je ne trouve pas beaucoup de conseils d'experts quand et où Pour lancer des erreurs.

  • Chaque code devrait-il être enveloppé dans un essai / capture?
  • Y a-t-il plus de conseils sur ce à quoi des erreurs devraient être capturées?
  • Y a-t-il des inconvénients à augmenter les erreurs au lieu d'avoir un code échouer silencieusement dans la production?
  • Cela a été touché sur SO en ce qui concerne les implémentations, mais les erreurs JS de serveur-enregistrement sont-elles une stratégie efficace?
  • Tout ce que je devrais savoir, concernant les erreurs de piégage dans ma demande?

Je suis également complètement jeu pour l'ouïe des livres qui ont de grands chapitres ou des explications approfondies de la gestion des erreurs. Eloquent JavaScript touche à la question, mais n'est pas très prescriptif ou opiniâtre sur le problème.

Merci pour tout conseil que vous pouvez donner!

Un ensemble immensément intéressant de diapositives sur Enterprise JavaScript Error Handling peut être trouvé à http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/

Bref, il résume:

  1. Supposons que votre code échouera
  2. Erreurs de journal sur le serveur
  3. Vous, pas le navigateur, manipulez des erreurs
  4. Identifiez les erreurs pouvant survenir
  5. Jette tes propres erreurs
  6. Distinguer les erreurs fatales et non fatales
  7. Fournir un mode de débogage

Les diapositives sont beaucoup plus détaillées et très probablement vous donneront des indications.

METTRE À JOUR

La présentation mentionnée ci-dessus peut être trouvée ici: http://www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation

Nicholas Zakas de Yahoo! La renommée a fait une conversation sur Enterprise Error Handling ( diapositives ) à Ajax Experience 2008, dans laquelle il a proposé quelque chose comme ceci:

 function log(sev,msg) { var img = new Image(); img.src = "log.php?sev=" + encodeURIComponent(sev) + "&msg=" + encodeURIComponent(msg); } // usage log(1, "Something bad happened.") // Auto-log uncaught JS errors window.onerror = function(msg, url, line) { log(1, msg); return true; } 

Un an plus tard, Nicholas Zakas a publié une mise à jour sur son blog qui comprenait un modèle intelligent pour injecter automatiquement le code de gestion des erreurs sur votre environnement de production (en utilisant une programmation orientée vers l'aspect).

Lorsque vous commencez à enregistrer des appels window.error, vous remarquerez deux choses:

  1. Si votre site est assez complexe, vous allez enregistrer beaucoup d'erreurs
  2. Vous verrez un tas de messages "window.error in undefined: 0" inutiles

Réduire le torrent des entrées de journal est aussi simple que tester la gravité et / ou un nombre aléatoire avant de se connecter au serveur:

 function log(sev,msg) { if (Math.random() > 0.1) return; // only log some errors var img = new Image(); img.src = "log.php?sev=" + encodeURIComponent(sev) + "&msg=" + encodeURIComponent(msg); } 

Le fait de manipuler les erreurs "window.error in indefined: 0" dépend de l'architecture de votre site, mais peut essayer d'identifier tous les appels Ajax et de lancer une exception lorsque quelque chose échoue (éventuellement, renvoyer une trace de pile avec stacktrace.js ).

IHMO, vous devez utiliser la gestion des erreurs dans javascript comme vous l'avez fait dans plusieurs autres langues (AFAIK: Python, Java).

Pour une meilleure lisibilité (et probablement une meilleure performance, même si je ne suis pas sûr que cela ait un très grand impact), vous devriez utiliser le bloc try / catch principalement dans les cas suivants:

  • La partie du code que vous voulez envelopper est une partie clé de l'algorithme complet . Si cela échoue, il pourrait:

    • Créez des erreurs sur la prochaine partie des codes (par exemple, parce que var est manquant …)
    • Faites la page ne pas regarder ce qui est attendu (impact sur le contenu ou le css)
    • Rendre les résultats apparemment étranges pour l'utilisateur (impact sur le comportement du code)
  • Vous savez que le code que vous écrivez n'est pas compatible avec tous les navigateurs

  • Vous avez prévu que le code pourrait échouer (car il n'y a pas d'autre moyen de vérifier qu'il devrait fonctionner si … puis … blocs)
  • Et aussi lorsque vous souhaitez déboguer sans déranger l'utilisateur final

Finalement, les experts en javascript peuvent avoir d'autres éléments à donner.

Mes 2 cents à la boîte,

Cordialement,

Max

En plus des autres réponses: une chose importante est d' utiliser les données de contexte disponibles dans les objets d'erreur JavaScript et dans les paramètres de la fonction window.onerror .

Des choses comme stacktrace (errorObject.stack), le nom de fichier, le numéro de ligne et le numéro de colonne. Notez que chaque navigateur a des différences … alors faites vos meilleurs efforts pour obtenir de belles erreurs.

Il peut même y avoir des problèmes avec l' objet de console lui-même . J'utilise une fonction personnalisée window.onerror inspirée de celle-ci et une fonction spéciale pour tracer n'importe quel objet d'erreur standard donné inspiré par ce code .

Un autre bon point est d'inclure la version de votre application Web quelque part proche de stacktrace (pour une copie et un collage rapides et sécurisés). Vous pouvez également afficher des erreurs de manière plus agressive (alerte …) en mode développement, car les développeurs ne surveilleront pas constamment la console du navigateur et peuvent ne pas voir certains des problèmes.

Aussi, utilisez éviter d'utiliser throw 'My message' , utilisez throw new Error('My message') , vous pouvez même avoir des erreurs personnalisées, lire cet article .

Toujours ajouter du contexte aux erreurs (la version, l'identifiant de l'objet, certains messages personnalisés, …) et assurez-vous également de faire une distinction entre les erreurs externes (certaines données externes ou la force a fait échouer votre système) et les erreurs internes / Assertions (votre propre système dérangé), lisez « Design by contract ».

Voici un guide .

Pensez également à utiliser la gestion générale des erreurs, comme les intercepteurs, vos bibliothèques et cadres:

  • JQuery
  • Angular 1.x et pour http
  • 2.x angulaire