Puis-je définir un type personnalisé pour les exceptions définies par l'utilisateur en JavaScript? Si oui, comment le ferais-je?
javascript
exception
Manki
la source
la source
Réponses:
De WebReference :
la source
catch (e) { if (e instanceof TypeError) { … } else { throw e; } }
⦃⦄ oucatch (e) { switch (e.constructor) { case TypeError: …; break; default: throw e; }
⦃⦄.Vous devez créer une exception personnalisée qui hérite de manière prototype d'Erreur. Par exemple:
Ceci est essentiellement une version simplifiée de ce disfated affiché ci-dessus avec l'amélioration que les traces de pile fonctionnent sur Firefox et d'autres navigateurs. Il satisfait aux mêmes tests qu'il a postés:
Usage:
Et il va se comporter est attendu:
la source
Vous pouvez implémenter vos propres exceptions et leur gestion par exemple comme ici:
Il existe une autre syntaxe pour intercepter une exception typée, bien que cela ne fonctionne pas dans tous les navigateurs (par exemple pas dans IE):
la source
Oui. Vous pouvez lancer tout ce que vous voulez: des entiers, des chaînes, des objets, peu importe. Si vous souhaitez lancer un objet, créez simplement un nouvel objet, comme vous le feriez dans d'autres circonstances, puis lancez-le. La référence Javascript de Mozilla a plusieurs exemples.
la source
Cela permet une utilisation comme ..
la source
e instanceof Error
serait faux.e instanceof MyError
cela serait vrai, l'else if(e instanceof Error)
énoncé ne serait jamais évalué.else if(e instanceof Error)
serait la dernière prise. Probablement suivi d'un simpleelse
(que je n'ai pas inclus). Un peu commedefault:
dans une instruction switch mais pour les erreurs.En bref:
Si vous utilisez ES6 sans transpilers :
Voir Extension de l'erreur en Javascript avec la syntaxe ES6 pour connaître la meilleure pratique actuelle
Si vous utilisez le transpilateur Babel :
Option 1: utilisez babel-plugin-transform-builtin-extend
Option 2: faites-le vous-même (inspiré de cette même bibliothèque)
Si vous utilisez ES5 pur :
Alternative: utiliser un cadre classtrophobe
Explication:
Pourquoi étendre la classe Error en utilisant ES6 et Babel est un problème?
Parce qu'une instance de CustomError n'est plus reconnue comme telle.
En fait, de la documentation officielle de Babel, vous ne pouvez pas étendre tout JavaScript intégré dans les classes telles que
Date
,Array
,DOM
ouError
.Le problème est décrit ici:
Qu'en est-il des autres réponses SO?
Toutes les réponses données corrigent le
instanceof
problème mais vous perdez l'erreur régulièreconsole.log
:Alors qu'en utilisant la méthode mentionnée ci-dessus, non seulement vous corrigez le
instanceof
problème, mais vous conservez également l'erreur régulièreconsole.log
:la source
Voici comment vous pouvez créer des erreurs personnalisées avec un comportement complètement identique au natif
Error
. Cette technique ne fonctionne que dans Chrome et node.js pour l'instant. Je ne recommanderais pas non plus de l'utiliser si vous ne comprenez pas ce qu'il fait.Comme résultat, nous obtenons
Ensuite, vous pouvez l'utiliser comme ceci:
Et utilisez
NotImplementedError
comme vous le feriezError
:Et il va se comporter est attendu:
Notez que cela
error.stack
fonctionne parfaitement et n'inclura pas d'NotImplementedError
appel constructeur (grâce aux v8Error.captureStackTrace()
).Remarque. Il est moche
eval()
. La seule raison pour laquelle il est utilisé est d'être correcterr.constructor.name
. Si vous n'en avez pas besoin, vous pouvez tout simplifier un peu.la source
Error.apply(self, arguments)
est spécifié pour ne pas fonctionner . Je suggère plutôt de copier la trace de la pile qui est compatible avec tous les navigateurs.J'utilise souvent une approche avec héritage prototypique. Primordial
toString()
vous donne l'avantage que des outils comme Firebug enregistreront les informations réelles au lieu de[object Object]
sur la console pour les exceptions non détectées.Utilisation
instanceof
pour déterminer le type d'exception.main.js
Exception.js
DuplicateIdException.js
la source
ES6
Avec la nouvelle classe et les mots clés étendus, c'est désormais beaucoup plus simple:
la source
Utilisez le lancer instruction .
JavaScript ne se soucie pas du type d'exception (comme le fait Java). JavaScript remarque juste, il y a une exception et quand vous l'attrapez, vous pouvez "regarder" ce que l'exception "dit".
Si vous devez lancer différents types d'exceptions, je vous suggère d'utiliser des variables qui contiennent la chaîne / l'objet de l'exception, c'est-à-dire le message. Lorsque vous en avez besoin, utilisez "throw myException" et dans la capture, comparez l'exception capturée à myException.
la source
Voir cet exemple dans le MDN.
Si vous devez définir plusieurs erreurs (testez le code ici !):
Le code est principalement copié à partir de: Quel est un bon moyen d'étendre l'erreur en JavaScript?
la source
Une alternative à la réponse d' asselin pour une utilisation avec les classes ES2015
la source
Maintenant, nous définissons ajouter la raison ou les propriétés que nous voulons à l'objet d'erreur et le récupérer. En rendant l'erreur plus raisonnable.
la source