Maison interface Web js tutoriel Une brève analyse de la gestion des erreurs JavaScript et du suivi de la pile

Une brève analyse de la gestion des erreurs JavaScript et du suivi de la pile

Nov 17, 2017 pm 01:27 PM
javascript js 追踪

Parfois, dans le processus d'accumulation de notre code, certains détails de gestion des erreurs et de traces de pile sont ignorés, mais si vous faites attention à ces détails, ils sont très utiles pour écrire des bibliothèques liées aux tests ou à la gestion des erreurs. vous une excellente idée de traitement. Cette idée peut grandement améliorer la façon dont nous gérons la pile. Lorsque l'assertion de l'utilisateur échoue, nous donnerons plus d'informations rapides (pour aider l'utilisateur à localiser

Gérer correctement les informations de la pile vous permet). pour effacer les données inutiles et vous concentrer uniquement sur les données utiles. Dans le même temps, une meilleure compréhension de l'objet Erreurs et de ses propriétés associées peut vous aider à utiliser davantage les

Erreurs.

Comment le La pile d'appels (de fonction) fonctionne

Avant de parler d'erreurs, il faut d'abord comprendre le principe de la pile d'appels (de fonction) :

Lorsqu'une fonction est appelée, elle est poussée en haut de la pile. Une fois la fonction terminée, elle sera supprimée du haut de la pile

La structure des données de la pile est en arrière Premier sorti, connu sous le nom de LIFO (dernier entré, premier sorti).

Par exemple :

function c() {
    console.log('c');
}
function b() {
    console.log('b');
    c();
}
function a() {
    console.log('a');
    b();
}
a();
Copier après la connexion


Dans l'exemple ci-dessus, lorsque la fonction a Au moment de l'exécution, elle sera ajoutée en haut de la pile. La fonction b est appelée à l'intérieur de la fonction a, la fonction b sera poussée vers le haut de la pile. Lorsque la fonction c est appelée à l'intérieur de la fonction b, lorsqu'elle est appelée en interne, elle sera également poussée vers le haut de la pile. Lorsque la fonction c s'exécute, la pile contient a, b et c (dans cet ordre).

Lorsque la fonction c s'exécute Une fois l'exécution de c terminée, elle sera supprimée du haut de la pile, puis le flux de contrôle. de l'appel de fonction revient à la fonction b. Une fois l'exécution de la fonction b terminée, elle sera également supprimée du haut de la pile, puis l'appel de fonction

Le flux de contrôle revient à la fonction a. sera supprimé du haut de la pile après l'exécution.

Afin de mieux démontrer le comportement de la pile dans la démo, vous pouvez utiliser la console trace() pour afficher les données actuelles de la pile sur la console. Dans le même temps, vous devez lire les données de la pile de sortie dans l'ordre de haut en bas.

L'exécution du code ci-dessus en mode REPL de Node entraînera la sortie suivante :

function c() {
    console.log('c');
    console.trace();
}
function b() {
    console.log('b');
    c();
}
function a() {
    console.log('a');
    b();
}
a();
Copier après la connexion

Trace
    at c (repl:3:9)
    at b (repl:3:1)
    at a (repl:3:1)
    at repl:1:1 // <-- For now feel free to ignore anything below this point, these are Node&#39;s internals
    at realRunInThisContextScript (vm.js:22:35)
    at sigintHandlersWrap (vm.js:98:12)
    at ContextifyScript.Script.runInThisContext (vm.js:24:12)
    at REPLServer.defaultEval (repl.js:313:29)
    at bound (domain.js:280:14)
    at REPLServer.runBound [as eval] (domain.js:293:12)
Copier après la connexion
Comme vous pouvez le voir, lors de la sortie de la fonction c, la pile contient les fonctions a, b et c.


Si vous sortez les données actuelles de la pile dans la fonction b après la fonction c est terminée, vous verrez que la fonction c a été supprimée du haut de la pile et la pile ne comprend que les fonctions a et b.

Comme vous pouvez le voir, une fois la fonction c terminée , il a été supprimé du haut de la pile.

function c() {
    console.log(&#39;c&#39;);
}
function b() {
    console.log(&#39;b&#39;);
    c();
    console.trace();
}
function a() {
    console.log(&#39;a&#39;);
    b();
}
Copier après la connexion
Objet d'erreur et gestion des erreurs

Lorsqu'une erreur se produit pendant l'exécution du programme When , un objet Error est généralement généré. L'objet Error peut être utilisé comme prototype hérité par l'objet error défini par l'utilisateur. L'objet
Trace
    at b (repl:4:9)
    at a (repl:3:1)
    at repl:1:1  // <-- For now feel free to ignore anything below this point, these are Node&#39;s internals
    at realRunInThisContextScript (vm.js:22:35)
    at sigintHandlersWrap (vm.js:98:12)
    at ContextifyScript.Script.runInThisContext (vm.js:24:12)
    at REPLServer.defaultEval (repl.js:313:29)
    at bound (domain.js:280:14)
    at REPLServer.runBound [as eval] (domain.js:293:12)
    at REPLServer.onLine (repl.js:513:10)
Copier après la connexion

Error.prototype contient les propriétés suivantes :

constructor–pointe vers le constructeur de l'instance.

message–message d'erreur

nom–nom de l'erreur (type)

Ce qui précède sont les propriétés standard de Error.prototype De plus, différents environnements d'exploitation ont leurs propres spécificités. propriétés. Dans des environnements tels que Node, Firefox, Chrome, Edge, IE 10+, Opera et Safari 6+

, l'objet Error a une propriété de pile, qui contient la trace de pile de l'erreur. instance d'erreur La trace de pile contient toutes les structures de pile depuis le constructeur.

Si vous souhaitez en savoir plus sur les propriétés spécifiques de l'objet Error, vous pouvez lire cet article sur MDN.

Pour to throw Pour une erreur, le mot-clé throw doit être utilisé. Afin d'intercepter une erreur générée, try...catch doit être utilisé pour contenir le code qui peut provoquer l'erreur. Le paramètre de Catch est l'instance d'erreur qui a été générée. .

Comme Java, JavaScript permet également l'utilisation du mot-clé enfin après try/catch. Après avoir traité l'erreur, vous pouvez effectuer un travail de nettoyage dans le bloc d'instructions final.

Syntaxiquement. , vous pouvez utiliser le bloc d'instructions try et d'autres. Il n'est pas nécessaire qu'il soit suivi d'un bloc d'instructions catch, mais il doit être suivi d'un bloc d'instructions enfin. Cela signifie qu'il existe trois formes d'instructions try différentes :

<🎜. >

essayer...attraper

essayer...enfin

essayer...attraper...enfin

Vous pouvez également intégrer des instructions try dans l'instruction Try :


Vous pouvez également intégrer des instructions try dans catch ou enfin :

Il est important de notez que lorsqu'une erreur est générée, vous pouvez simplement lancer une valeur simple au lieu d'un objet Error. Bien que cela ait l'air sympa et soit autorisé, ce n'est pas une approche recommandée, en particulier pour les développeurs de bibliothèques et de frameworks qui doivent gérer d'autres. le code des gens, car il n'y a pas de norme à laquelle se référer et il n'y a aucun moyen de savoir ce qui sera reçu des utilisateurs. Quoi. Vous ne pouvez pas faire confiance à l'utilisateur pour lancer un objet Error, car il ne peut pas le faire et simplement le lancer. une chaîne ou une valeur Cela signifie également qu'il est difficile de gérer les informations de pile et autres méta-informations
try {
    try {
        throw new Error(&#39;Nested error.&#39;); // The error thrown here will be caught by its own `catch` clause
    } catch (nestedErr) {
        console.log(&#39;Nested catch&#39;); // This runs
    }
} catch (err) {
    console.log(&#39;This will not run.&#39;);
}
Copier après la connexion

Par exemple :

try {
    console.log(&#39;The try block is running...&#39;);
} finally {
    try {
        throw new Error(&#39;Error inside finally.&#39;);
    } catch (err) {
        console.log(&#39;Caught an error inside the finally block.&#39;);
    }
}
Copier après la connexion

Si le paramètre est transmis par l'utilisateur au. La fonction runWithoutThrowing renvoie un objet d'erreur, le code ci-dessus peut capturer l'erreur normalement. Ensuite, si une chaîne est lancée, elle frappera. Vous avez quelques questions :

.
function runWithoutThrowing(func) {
    try {
        func();
    } catch (e) {
        console.log(&#39;There was an error, but I will not throw it.&#39;);
        console.log(&#39;The error\&#39;s message was: &#39; + e.message)
    }
}
function funcThatThrowsString() {
    throw &#39;I am a String.&#39;;
}
runWithoutThrowing(funcThatThrowsString);
Copier après la connexion

现在第二个 console.log 会输出undefined. 这看起来不是很重要, 但如果你需要确保 Error 对象有一个特定的属性或者用另一种方式来处理 Error 对象的特定属性(例如 Chai的throws断言的做法), 你就得做大量的工作来确保程序的正确运行.同时, 如果抛出的不是 Error 对象, 也就获取不到 stack 属性.

Errors 也可以被作为其它对象, 你也不必抛出它们, 这也是为什么大多数回调函数把 Errors 作为第一个参数的原因. 例如:

const fs = require(&#39;fs&#39;);
fs.readdir(&#39;/example/i-do-not-exist&#39;, function callback(err, dirs) {
    if (err instanceof Error) {
        // `readdir` will throw an error because that directory does not exist
        // We will now be able to use the error object passed by it in our callback function
        console.log(&#39;Error Message: &#39; + err.message);
        console.log(&#39;See? We can use Errors without using try statements.&#39;);
    } else {
        console.log(dirs);
    }
});
Copier après la connexion

最后, Error 对象也可以用于 rejected promise, 这使得很容易处理 rejected promise:

new Promise(function(resolve, reject) {
    reject(new Error(&#39;The promise was rejected.&#39;));
}).then(function() {
    console.log(&#39;I am an error.&#39;);
}).catch(function(err) {
    if (err instanceof Error) {
        console.log(&#39;The promise was rejected with an error.&#39;);
        console.log(&#39;Error Message: &#39; + err.message);
    }
});
Copier après la connexion

处理堆栈

这一节是针对支持 Error.captureStackTrace的运行环境, 例如Nodejs.

Error.captureStackTrace 的第一个参数是 object, 第二个可选参数是一个 function.Error.captureStackTrace 会捕获堆栈信息, 并在第一个参数中创建

stack 属性来存储捕获到的堆栈信息. 如果提供了第二个参数, 该函数将作为堆栈调用的终点. 因此, 捕获到的堆栈信息将只显示该函数调用之前的信息.

用下面的两个demo来解释一下. 第一个, 仅将捕获到的堆栈信息存于一个普通的对象之中:

const myObj = {};
function c() {
}
function b() {
    // Here we will store the current stack trace into myObj
    Error.captureStackTrace(myObj);
    c();
}
function a() {
    b();
}
// First we will call these functions
a();
// Now let&#39;s see what is the stack trace stored into myObj.stack
console.log(myObj.stack);
// This will print the following stack to the console:
//    at b (repl:3:7) <-- Since it was called inside B, the B call is the last entry in the stack
//    at a (repl:2:1)
//    at repl:1:1 <-- Node internals below this line
//    at realRunInThisContextScript (vm.js:22:35)
//    at sigintHandlersWrap (vm.js:98:12)
//    at ContextifyScript.Script.runInThisContext (vm.js:24:12)
//    at REPLServer.defaultEval (repl.js:313:29)
//    at bound (domain.js:280:14)
//    at REPLServer.runBound [as eval] (domain.js:293:12)
//    at REPLServer.onLine (repl.js:513:10)
Copier après la connexion

从上面的示例可以看出, 首先调用函数 a(被压入堆栈), 然后在 a 里面调用函数 b(被压入堆栈且在a之上), 然后在 b 中捕获到当前的堆栈信息, 并将其存储到 myObj 中. 所以, 在控制台输出的堆栈信息中仅包含了 a和 b 的调用信息.

现在, 我们给 Error.captureStackTrace 传递一个函数作为第二个参数, 看下输出信息:

const myObj = {};
function d() {
    // Here we will store the current stack trace into myObj
    // This time we will hide all the frames after `b` and `b` itself
    Error.captureStackTrace(myObj, b);
}
function c() {
    d();
}
function b() {
    c();
}
function a() {
    b();
}
// First we will call these functions
a();
// Now let&#39;s see what is the stack trace stored into myObj.stack
console.log(myObj.stack);
 
// This will print the following stack to the console:
//    at a (repl:2:1) <-- As you can see here we only get frames before `b` was called
//    at repl:1:1 <-- Node internals below this line
//    at realRunInThisContextScript (vm.js:22:35)
//    at sigintHandlersWrap (vm.js:98:12)
//    at ContextifyScript.Script.runInThisContext (vm.js:24:12)
//    at REPLServer.defaultEval (repl.js:313:29)
//    at bound (domain.js:280:14)
//    at REPLServer.runBound [as eval] (domain.js:293:12)
//    at REPLServer.onLine (repl.js:513:10)
//    at emitOne (events.js:101:20)
Copier après la connexion


当将函数 b 作为第二个参数传给 Error.captureStackTraceFunction 时, 输出的堆栈就只包含了函数 b 调用之前的信息(尽管 Error.captureStackTraceFunction 是在函数 d 中调用的), 这也就是为什么只在控制台输出了 a. 这样处理方式的好处就是用来隐藏一些与用户无关的内部实现细节.

感谢大家阅读本篇文章,之后也会给大家带来关于JS,关于前端的一些小技巧,希望大家共同探讨,一起进步。


相关推荐:

JavaScript和ECMAScript 之间的区别

JavaScript刷新页面location.reload()的用法

JavaScript中正则表达式的含义与使用

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Dec 17, 2023 pm 02:54 PM

Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de reconnaissance vocale en ligne Introduction : Avec le développement continu de la technologie, la technologie de reconnaissance vocale est devenue une partie importante du domaine de l'intelligence artificielle. Le système de reconnaissance vocale en ligne basé sur WebSocket et JavaScript présente les caractéristiques d'une faible latence, d'un temps réel et d'une multiplateforme, et est devenu une solution largement utilisée. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de reconnaissance vocale en ligne.

Recommandé : Excellent projet de détection et de reconnaissance des visages open source JS Recommandé : Excellent projet de détection et de reconnaissance des visages open source JS Apr 03, 2024 am 11:55 AM

La technologie de détection et de reconnaissance des visages est déjà une technologie relativement mature et largement utilisée. Actuellement, le langage d'application Internet le plus utilisé est JS. La mise en œuvre de la détection et de la reconnaissance faciale sur le front-end Web présente des avantages et des inconvénients par rapport à la reconnaissance faciale back-end. Les avantages incluent la réduction de l'interaction réseau et de la reconnaissance en temps réel, ce qui réduit considérablement le temps d'attente des utilisateurs et améliore l'expérience utilisateur. Les inconvénients sont les suivants : il est limité par la taille du modèle et la précision est également limitée ; Comment utiliser js pour implémenter la détection de visage sur le web ? Afin de mettre en œuvre la reconnaissance faciale sur le Web, vous devez être familier avec les langages et technologies de programmation associés, tels que JavaScript, HTML, CSS, WebRTC, etc. Dans le même temps, vous devez également maîtriser les technologies pertinentes de vision par ordinateur et d’intelligence artificielle. Il convient de noter qu'en raison de la conception du côté Web

Outils essentiels pour l'analyse boursière : découvrez les étapes pour dessiner des graphiques en bougies avec PHP et JS Outils essentiels pour l'analyse boursière : découvrez les étapes pour dessiner des graphiques en bougies avec PHP et JS Dec 17, 2023 pm 06:55 PM

Outils essentiels pour l'analyse boursière : découvrez les étapes pour dessiner des graphiques en bougies en PHP et JS. Des exemples de code spécifiques sont nécessaires. Avec le développement rapide d'Internet et de la technologie, le trading d'actions est devenu l'un des moyens importants pour de nombreux investisseurs. L'analyse boursière est une partie importante de la prise de décision des investisseurs, et les graphiques en bougies sont largement utilisés dans l'analyse technique. Apprendre à dessiner des graphiques en bougies à l'aide de PHP et JS fournira aux investisseurs des informations plus intuitives pour les aider à prendre de meilleures décisions. Un graphique en chandeliers est un graphique technique qui affiche les cours des actions sous forme de chandeliers. Il montre le cours de l'action

WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel Dec 17, 2023 pm 05:30 PM

WebSocket et JavaScript : technologies clés pour réaliser des systèmes de surveillance en temps réel Introduction : Avec le développement rapide de la technologie Internet, les systèmes de surveillance en temps réel ont été largement utilisés dans divers domaines. L'une des technologies clés pour réaliser une surveillance en temps réel est la combinaison de WebSocket et de JavaScript. Cet article présentera l'application de WebSocket et JavaScript dans les systèmes de surveillance en temps réel, donnera des exemples de code et expliquera leurs principes de mise en œuvre en détail. 1. Technologie WebSocket

Comment suivre l'emplacement précis de votre téléphone Apple s'il est perdu et éteint ? Comment suivre l'emplacement précis de votre téléphone Apple s'il est perdu et éteint ? Mar 08, 2024 pm 02:30 PM

Il est possible de récupérer un téléphone Apple s'il est perdu et éteint. La méthode est également très simple. Les utilisateurs peuvent choisir de se connecter au site officiel iCloud pour effectuer une recherche, ou un ami qui utilise également un téléphone Apple peut utiliser son téléphone. pour rechercher votre iPhone. Comment suivre l'emplacement précis d'un téléphone Apple s'il est perdu et éteint ? Réponse : Recherchez sur le site officiel iCloud ou empruntez l'appareil iPhone de quelqu'un d'autre pour le retrouver. 1. Les utilisateurs constatent que leur téléphone Apple est perdu ou manquant, et. il peut être trouvé même s'il est éteint. 2. Les utilisateurs se connectent directement au site officiel iCloud, cliquez sur Localiser mon iPhone et assurez-vous de saisir le numéro de compte correct. 3. Assurez-vous que votre compte est cohérent avec le compte du téléphone perdu afin d'avoir une chance de récupérer le téléphone. 4. Si le téléphone est allumé et connecté

Comment utiliser JavaScript et WebSocket pour mettre en œuvre un système de commande en ligne en temps réel Comment utiliser JavaScript et WebSocket pour mettre en œuvre un système de commande en ligne en temps réel Dec 17, 2023 pm 12:09 PM

Introduction à l'utilisation de JavaScript et de WebSocket pour mettre en œuvre un système de commande en ligne en temps réel : avec la popularité d'Internet et les progrès de la technologie, de plus en plus de restaurants ont commencé à proposer des services de commande en ligne. Afin de mettre en œuvre un système de commande en ligne en temps réel, nous pouvons utiliser les technologies JavaScript et WebSocket. WebSocket est un protocole de communication full-duplex basé sur le protocole TCP, qui peut réaliser une communication bidirectionnelle en temps réel entre le client et le serveur. Dans le système de commande en ligne en temps réel, lorsque l'utilisateur sélectionne des plats et passe une commande

JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel Dec 17, 2023 pm 05:13 PM

JavaScript et WebSocket : Construire un système efficace de prévisions météorologiques en temps réel Introduction : Aujourd'hui, la précision des prévisions météorologiques revêt une grande importance pour la vie quotidienne et la prise de décision. À mesure que la technologie évolue, nous pouvons fournir des prévisions météorologiques plus précises et plus fiables en obtenant des données météorologiques en temps réel. Dans cet article, nous apprendrons comment utiliser la technologie JavaScript et WebSocket pour créer un système efficace de prévisions météorologiques en temps réel. Cet article démontrera le processus de mise en œuvre à travers des exemples de code spécifiques. Nous

Conseils de développement PHP et JS : maîtrisez la méthode de création de graphiques en bougies boursières Conseils de développement PHP et JS : maîtrisez la méthode de création de graphiques en bougies boursières Dec 18, 2023 pm 03:39 PM

Avec le développement rapide de la finance sur Internet, l'investissement en actions est devenu le choix de plus en plus de personnes. Dans le trading d'actions, les graphiques en bougies sont une méthode d'analyse technique couramment utilisée. Ils peuvent montrer l'évolution des cours des actions et aider les investisseurs à prendre des décisions plus précises. Cet article présentera les compétences de développement de PHP et JS, amènera les lecteurs à comprendre comment dessiner des graphiques en bougies boursières et fournira des exemples de code spécifiques. 1. Comprendre les graphiques en bougies boursières Avant de présenter comment dessiner des graphiques en bougies boursières, nous devons d'abord comprendre ce qu'est un graphique en bougies. Les graphiques en chandeliers ont été développés par les Japonais

See all articles