Je cherche à rendre mon code JavaScript un peu plus résistant aux erreurs et je trouve une documentation abondante sur l'utilisation de try
, catch
, finally
et throw
, mais je ne trouve pas une tonne de conseils d'experts sur quand et où jeter des erreurs.
Je suis aussi complètement prêt à entendre parler de livres qui contiennent d'excellents chapitres ou des explications détaillées sur la gestion des erreurs. JavaScript éloquent aborde le sujet, mais n’est pas très normatif ou ne suscite pas d’opinion.
Merci pour tout conseil que vous pouvez donner!
Vous trouverez une série extrêmement intéressante de diapositives sur le traitement des erreurs JavaScript dans Enterprise à l'adresse suivante: http://www.devhands.com/2008/10/javascript-error-handling-and-general-best- pratiques/
En bref, il résume:
Les diapositives vont beaucoup plus en détail et vous donneront probablement une direction.
MISE À 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 célébrité a fait un exposé sur le traitement des erreurs d'entreprise ( slides ) à Ajax Experience 2008, dans lequel 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 publiait un mise à jour sur son blog , qui incluait un modèle astucieux pour injecter automatiquement du code de gestion des erreurs dans votre environnement de production (à l'aide d'une programmation orientée aspect).
Lorsque vous démarrez la journalisation des appels window.error, vous remarquerez deux choses:
Réduire le torrent des entrées de journal est aussi simple que de 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);
}
La gestion des erreurs inutiles "window.error in undefined: 0" dépend de l'architecture de votre site, mais peut essayer d'identifier tous les appels Ajax et de lever une exception en cas d'échec (le renvoi éventuel d'une trace de pile à l'aide de stacktrace.js ).
IHMO, vous devez utiliser la gestion des erreurs en javascript comme dans plusieurs autres langages (AFAIK: Python, Java).
Pour une meilleure lisibilité (et probablement de meilleures performances, même si je ne suis pas sûr que cela ait un impact très important), vous devez utiliser le bloc try/catch principalement dans les cas suivants:
La partie du code que vous voulez insérer est une clé partie de l'algorithme complet. Si cela échoue, il pourrait:
Vous savez que le code que vous écrivez est non compatible avec tous les navigateurs
Finalement, les experts en javascript peuvent avoir d'autres éléments à fournir.
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 le stacktrace (errorObject.stack), le nom du fichier, le numéro de ligne et le numéro de colonne. Notez que chaque navigateur a quelques différences ... alors faites de votre mieux pour obtenir les erreurs de Nice.
Il peut même y avoir des problèmes avec le objet console lui-même . J'utilise ne fonction window.onerror personnalisée inspirée de celle-ci et une fonction spéciale permettant de tracer un objet d'erreur standard donné inspiré de ce code .
Un autre avantage est d’inclure la version de votre application Web quelque part à proximité du chemin de pile (pour un copier-coller rapide et sûr). Vous pouvez également afficher des erreurs plus agressives (alerte ...) en mode de développement, car les développeurs ne surveilleront pas constamment la console du navigateur et risquent de ne pas voir certains des problèmes.
Évitez également d'utiliser throw 'My message'
, Utilisez throw new Error('My message')
, vous pouvez même avoir des erreurs personnalisées, lisez cet article .
Ajoutez toujours un contexte aux erreurs (la version, l'id de l'objet, des messages personnalisés, ...) et veillez également à faire la 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 foiré), lisez sur ' Conception par contrat '.
Voici un guide .
Pensez également à utiliser le traitement général des erreurs comme des intercepteurs dans vos bibliothèques et vos frameworks: