Points de base
window.onerror
est un événement de navigateur qui est déclenché lorsqu'une erreur JavaScript non apportée est lancée, fournissant un moyen facile de journaliser les erreurs du client et de les signaler au serveur. Tous les navigateurs modernes prennent en charge cet événement, mais les détails de mise en œuvre varient. window.onerror
window.onerror
Cet article est créé en collaboration avec Sentry. Merci de soutenir les partenaires qui ont rendu le point de point possible.
est un événement de navigateur spécial qui est déclenché chaque fois qu'une erreur JavaScript non apportée est lancée. C'est l'un des moyens les plus simples de connecter les erreurs du client et de les signaler au serveur. Il s'agit également de l'un des principaux mécanismes de l'intégration JavaScript du client de Sentry (Raven-JS) à fonctionner. window.onerror
en attribuant des fonctions à window.onerror
onerror
window.onerror = function (msg, url, lineNo, columnNo, error) { // ... 处理错误 ... return false; }
msg
url
lineNo
columnNo
error
Objet d'erreur et erreur.stack
À première vue, l'objet d'erreur n'est pas spécial. Il contient 3 propriétés normalisées: message, nom de fichier et nombre de linais. Ces valeurs redondantes vous ont été fournies via
.La partie précieuse est un attribut
non standard : . Cette propriété de pile vous indique l'emplacement source de chaque trame de programme lorsqu'une erreur se produit. Les traces de pile d'erreur peuvent être un élément clé du débogage. Bien que non standard, cette propriété est disponible dans chaque navigateur moderne. Error.prototype.stack
window.onerror = function (msg, url, lineNo, columnNo, error) { // ... 处理错误 ... return false; }
Ce qui suit est à quoi il ressemble après la mise en forme:
<code>"Error: foobar\n at new bar (<anonymous>:241:11)\n at foo (<anonymous>:245:5)\n at <anonymous>:250:5\n at <anonymous>:251:3\n at <anonymous>:267:4\n at callFunction (<anonymous>:229:33)\n at <anonymous>:239:23\n at <anonymous>:240:3\n at Object.InjectedScript._evaluateOn (<anonymous>:875:140)\n at Object.InjectedScript._evaluateAndWrap (<anonymous>:808:34)" </anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></code>
Il n'y a qu'un seul problème: l'attribut de pile n'est pas standard, et son implémentation dans différents navigateurs est également différente. Par exemple, ce qui suit est la même trace de pile dans Internet Explorer 11:
<code>Error: foobar at new bar (<anonymous>:241:11) at foo (<anonymous>:245:5) at callFunction (<anonymous>:229:33) at Object.InjectedScript._evaluateOn (<anonymous>:875:140) at Object.InjectedScript._evaluateAndWrap (<anonymous>:808:34) </anonymous></anonymous></anonymous></anonymous></anonymous></code>
Heureusement, il existe des outils qui peuvent normaliser les attributs de pile afin qu'ils soient cohérents entre les navigateurs. Par exemple, Raven-JS utilise Tracekit pour normaliser les chaînes d'erreur. Il y a StackTrace.js et quelques autres projets.
Compatibilité du navigateur
est là dans le navigateur depuis un certain temps - vous pouvez le trouver dans des navigateurs plus anciens comme IE6 et Firefox 2. window.onerror
d'une manière différente, en particulier en termes de nombre de paramètres envoyés à l'écouteur ONERROR et de la structure de ces paramètres. window.onerror
Le support limité pour onerror
dans Internet Explorer 8, 9 et 10 peut ne pas être surprenant. Mais vous pourriez être surpris de constater que Safari n'a pas ajouté de prise en charge des objets d'erreur avant Safari 10 (publié en 2016). De plus, les appareils mobiles hérités qui utilisent toujours le navigateur Android d'origine (désormais remplacé par Chrome Mobile) existent toujours et aucun objet d'erreur n'est passé.
S'il n'y a pas d'objet d'erreur, il n'y a pas de propriété de trace de pile. Cela signifie que ces navigateurs ne peuvent pas récupérer des informations précieuses de pile à partir d'erreurs capturées par onerror
.
Utilisez Try / Catch pour fournir des polyfills pour Window.onerror
Mais il y a une solution de contournement - vous pouvez envelopper le code dans l'application dans un bloc d'essai / capture et attraper les erreurs vous-même. Cet objet d'erreur contiendra l'attribut de pile dont nous rêvons dans chaque navigateur moderne.
Considérez la méthode d'assistance suivante invoke
, qui appelle une fonction sur un objet en utilisant une série de paramètres:
window.onerror = function (msg, url, lineNo, columnNo, error) { // ... 处理错误 ... return false; }
Ce qui suit est appelé à nouveau invoke
, cette fois enveloppé dans Try / Catch pour attraper toutes les erreurs lancées:
<code>"Error: foobar\n at new bar (<anonymous>:241:11)\n at foo (<anonymous>:245:5)\n at <anonymous>:250:5\n at <anonymous>:251:3\n at <anonymous>:267:4\n at callFunction (<anonymous>:229:33)\n at <anonymous>:239:23\n at <anonymous>:240:3\n at Object.InjectedScript._evaluateOn (<anonymous>:875:140)\n at Object.InjectedScript._evaluateAndWrap (<anonymous>:808:34)" </anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></code>
Bien sûr, il est très lourd de le faire manuellement n'importe où. Vous pouvez le simplifier en créant une fonction d'utilité de wrapper commune:
<code>Error: foobar at new bar (<anonymous>:241:11) at foo (<anonymous>:245:5) at callFunction (<anonymous>:229:33) at Object.InjectedScript._evaluateOn (<anonymous>:875:140) at Object.InjectedScript._evaluateAndWrap (<anonymous>:808:34) </anonymous></anonymous></anonymous></anonymous></anonymous></code>
Parce que JavaScript est unique, vous n'avez pas besoin d'utiliser des wrappers partout - commencez simplement par chaque nouvelle pile.
Cela signifie que vous devez envelopper la déclaration de fonction:
$(document).ready
) addEventListener
ou $.fn.click
) setTimeout
ou requestAnimationFrame
) Exemple:
<code>Error: foobar at bar (Unknown script code:2:5) at foo (Unknown script code:6:5) at Anonymous function (Unknown script code:11:5) at Anonymous function (Unknown script code:10:2) at Anonymous function (Unknown script code:1:73)</code>
Si cela ressemble à beaucoup de travail, ne vous inquiétez pas! La plupart des bibliothèques de reporting de bogues ont des mécanismes qui améliorent les fonctions intégrées telles que addEventListener
et setTimeout
, vous n'avez donc pas à appeler vous-même à chaque fois l'utilitaire de wrapper. Oui, Raven-Js fait de même.
Transférer les erreurs vers le serveur
ok, vous avez fait votre travail - vous avez inséré window.onerror
, et vous avez également enveloppé la fonction dans un bloc d'essai / capture pour capturer autant d'informations d'erreur que possible.
Une seule dernière étape est laissée: transférer le message d'erreur vers le serveur. Pour que cela fonctionne, vous devez configurer une sorte de service Web de rapport qui recevra vos données d'erreur via HTTP, la connectez-la à un fichier et / ou les stockera dans une base de données.
Si ce service Web se trouve sur le même domaine que votre application Web, utilisez simplement XMLHTTPREQUEST. Dans l'exemple suivant, nous utilisons la fonction AJAX de JQuery pour transférer des données vers notre serveur:
function invoke(obj, method, args) { return obj[method].apply(this, args); } invoke(Math, 'max', [1, 2]); // 返回 2
Notez que si vous devez transmettre des erreurs entre différentes sources, votre point de terminaison de rapport doit prendre en charge le partage de ressources inter-domaines (COR).
Résumé
Si vous l'avez fait, vous avez maintenant tous les outils nécessaires pour faire défiler votre propre bibliothèque de reporting d'erreur de base et l'intégrer à votre application:
window.onerror
fonctionne et ses navigateurs pris en charge window.onerror
Trace de pile manquante Bien sûr, si vous ne voulez pas vous soucier de tout cela, il existe de nombreux outils commerciaux et open source qui peuvent faire tout le monde de la rapports de clients pour vous. (Shh: vous voudrez peut-être essayer d'utiliser Sentry pour déboguer JavaScript.)
c'est tout! Surveillance des erreurs heureuse.
FAQ (FAQ) sur l'utilisation de Window.onerror pour capturer et signaler les erreurs JavaScript
window.onerror
Comment fonctionnent les fonctions en JavaScript? L'événement window.onerror
dans JavaScript est un gestionnaire d'événements global qui est déclenché lorsqu'une erreur se produit lors de l'exécution du code JavaScript. Il s'agit d'un puissant outil de débogage et de gestion des erreurs car il peut attraper et signaler des exceptions non apprises ou des erreurs d'exécution. Lorsqu'une erreur se produit, la fonction window.onerror
sera appelée avec cinq paramètres: message d'erreur, URL où l'erreur s'est produite, le numéro de ligne, le numéro de colonne et l'objet d'erreur.
window.onerror
et le coup d'essai en javascript? window.onerror
et les coups d'essai sont tous deux utilisés pour la gestion des erreurs en JavaScript, mais ils fonctionnent différemment. L'instruction TRYPRACCH vous permet de gérer directement l'erreur en enveloppe le code qui peut lancer une erreur dans un bloc d'essai, puis en répondant à l'erreur dans le bloc de capture. D'un autre côté, window.onerror
est un gestionnaire d'événements mondial qui est déclenché lorsqu'une erreur d'exécution non apportée se produit. Il s'agit d'un mécanisme de gestion des erreurs plus général qui capture des erreurs qui glissent du bloc d'essai.
window.onerror
pour assister aux erreurs JavaScript? Pour utiliser window.onerror
, vous devez définir une fonction qui sera appelée lorsqu'une erreur se produit. Cette fonction doit prendre cinq paramètres: message d'erreur, URL où l'erreur s'est produite, le numéro de ligne, le numéro de colonne et l'objet d'erreur. À l'intérieur de cette fonction, vous pouvez gérer les erreurs au besoin. Par exemple, vous pouvez enregistrer des erreurs à la console, envoyer des rapports au serveur ou afficher des messages aux utilisateurs.
window.onerror
Tous les types d'erreurs JavaScript peuvent-ils être capturés? Bien que window.onerror
soit un puissant outil de gestion des erreurs, il a certaines limites. Il peut attraper les erreurs d'exécution les plus non apprises, mais il ne peut pas prendre des exceptions lancées et prises dans le bloc de coups d'essai. De plus, certains types d'erreurs, tels que les erreurs de réseau ou les erreurs COR, peuvent ne pas déclencher l'événement window.onerror
.
window.onerror
? est le cinquième paramètre transmis à la fonction window.onerror
. Il contient des informations sur une erreur s'est produite, y compris les messages d'erreur, les noms d'erreur et les traces de pile. Vous pouvez utiliser cet objet pour obtenir des informations plus détaillées sur l'erreur, ce qui est très utile pour le débogage ou les rapports d'erreur.
La trace de pile est un rapport qui fournit des informations sur le chemin d'exécution du programme lorsqu'une erreur se produit. Il affiche la séquence des appels de fonction qui provoquent l'erreur, ce qui est très utile pour le débogage. Dans JavaScript, vous pouvez obtenir une trace de pile à partir d'un objet d'erreur.
Dans JavaScript, vous pouvez obtenir une trace de pile à partir d'un objet d'erreur. Lorsqu'une erreur se produit, un objet d'erreur est créé et transmis à la fonction window.onerror
. Cet objet a une propriété appelée pile qui contient la trace de pile. Vous pouvez accéder à cette propriété pour obtenir une trace de pile.
window.onerror
pour signaler l'erreur au serveur? Oui, vous pouvez utiliser window.onerror
pour signaler les erreurs au serveur. À l'intérieur de votre fonction window.onerror
, vous pouvez envoyer une demande au serveur avec un message d'erreur. Ceci est très utile pour surveiller et déboguer, car il vous permet de collecter et d'analyser les données d'erreur des utilisateurs en temps réel.
window.onerror
pour gérer les erreurs CORS? Erreur CORS ou L'erreur de partage des ressources inter-domaines se produit lorsqu'une application Web essaie d'accéder aux ressources à partir d'un domaine différent. Ces erreurs sont liées à la sécurité et pour des raisons de sécurité, aucun détail n'est fourni au gestionnaire d'événements window.onerror
. Cependant, vous pouvez gérer ces erreurs en ajoutant un gestionnaire d'erreurs à une demande de réseau spécifique qui peut entraîner des erreurs CORS.
window.onerror
? Lorsque vous utilisez window.onerror
, assurez-vous de gérer les erreurs d'une manière qui n'interrompt pas l'expérience utilisateur. Vous devez éviter d'afficher des messages d'erreur techniques aux utilisateurs. Pensez plutôt à afficher un message d'erreur amical ou à enregistrer silencieusement une erreur. Soyez également conscient de l'impact des performances du code de gestion des erreurs. Par exemple, si vous envoyez un rapport d'erreur au serveur, assurez-vous de le faire de manière asynchrone afin qu'il ne bloque pas le thread principal.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!