Je veux écrire un gestionnaire d'erreurs commun qui capturera volontairement les erreurs personnalisées sur n'importe quelle instance du code.
Quand j'ai throw new Error('sample')
aimé dans le code suivant
try {
throw new Error({'hehe':'haha'});
// throw new Error('hehe');
} catch(e) {
alert(e);
console.log(e);
}
Le journal s'affiche dans Firefox as Error: [object Object]
et je n'ai pas pu analyser l'objet.
Pour la seconde, throw
le journal affiche:Error: hehe
Alors que quand je l'ai fait
try {
throw ({'hehe':'haha'});
} catch(e) {
alert(e);
console.log(e);
}
la console s'est affichée comme: Object { hehe="haha"}
dans laquelle j'ai pu accéder aux propriétés d'erreur.
Quelle est la différence?
La différence est-elle visible dans le code? Une chaîne similaire sera simplement passée en tant que chaîne et un objet en tant qu'objets, mais la syntaxe sera-t-elle différente?
Je n'ai pas exploré lancer un objet d'erreur… Je n'avais fait que lancer des cordes.
Existe-t-il un autre moyen que les deux méthodes mentionnées ci-dessus?
la source
Error
sRéponses:
Voici une bonne explication sur l' objet Error et le lancement de vos propres erreurs
L'objet d'erreur
Que pouvons-nous en extraire en cas d'erreur? L'objet Error dans tous les navigateurs prend en charge les deux propriétés suivantes:
name: le nom de l'erreur, ou plus précisément, le nom de la fonction constructeur à laquelle appartient l'erreur.
message: une description de l'erreur, cette description variant en fonction du navigateur.
Six valeurs possibles peuvent être renvoyées par la propriété name, qui, comme mentionné, correspond aux noms des constructeurs de l'erreur. Elles sont:
Lancer vos propres erreurs (exceptions)
Au lieu d'attendre que l'un des 6 types d'erreurs se produise avant que le contrôle ne soit automatiquement transféré du bloc try au bloc catch, vous pouvez également lever explicitement vos propres exceptions pour forcer cela à se produire à la demande. C'est idéal pour créer vos propres définitions de ce qu'est une erreur et quand le contrôle doit être transféré à catch.
la source
Error
(et les sous-classes) sont utilisées par convention. Par défaut, ils fournissent également une propriété de pile, bien qu'elle puisse être ajoutée manuellement à n'importe quelle autre. C'est donc surtout une convention, le déroulement du programme n'est pas affecté par ce que vous lancez, juste que vousthrow
en avez à tous les égards. Vous pourriezthrow "grandmother down the stairs";
et cela fonctionnerait de la même manière, sauf qu'il n'y aura pas de trace de pile attachée et de fonctions de gestion des erreurs, les journalistes, les débogueurs s'attendentError
, ou les propriétés fournies, pour être plus précis.lancer "I'm Evil"
throw
mettra fin à l'exécution et exposera la chaîne de message lors de la capture de l'erreur.La console après le lancer ne sera jamais atteinte à cause de l'arrêt.
lancer une nouvelle erreur ("I'm so sweet")
throw new Error
expose un événement d'erreur avec deux paramètres nom et message . Il met également fin à l'exécution ultérieurela source
Error
, d'accord, où est le lien avec le commentaire? La moitié des personnes qui ont commenté et répondu à la question des PO auraient dû rester silencieuses.Used as a function
partir de ce lien ... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…L'article suivant va peut-être plus en détail quant à ce qui est un meilleur choix;
throw 'An error'
outhrow new Error('An error')
:http://www.nczonline.net/blog/2009/03/10/the-art-of-throwing-javascript-errors-part-2/
Cela suggère que ce dernier (
new Error()
) est plus fiable, car les navigateurs comme Internet Explorer et Safari (incertain des versions) ne signalent pas correctement le message lors de l'utilisation du premier.la source
Vous mentionnez d'abord ce code:
puis dans votre premier exemple vous écrivez:
Le premier objet Error fonctionnerait réellement, car il attend une valeur de chaîne, dans ce cas «échantillon». Le second ne le serait pas parce que vous essayez de passer un objet et qu'il attend une chaîne.
L'objet d'erreur aurait la propriété "message", qui serait "échantillon".
la source
toString()
méthode sur l'objet transmis, ce qui entraîne[object Object]
l'erreur (comme l'écrit l'Op).TLDR: ils sont équivalents.
source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error
la source
vous pouvez
throw
comme objetpuis par exemple dans votre
try/catch
ou simplement lancer une erreur de chaîne
la source
Le
Error
constructeur est utilisé pour créer un objet d'erreur. Les objets d'erreur sont levés lorsque des erreurs d'exécution se produisent. L'objet Error peut également être utilisé comme objet de base pour les exceptions définies par l'utilisateur.Les erreurs définies par l'utilisateur sont lancées via l'
throw
instruction. le contrôle du programme sera transmis au premiercatch
bloc de la pile d'appels.La différence entre lancer une erreur avec et sans objet Error:
Dans chrome devtools ressemble à ceci:
Chrome nous dit que nous avons une erreur non détectée qui n'est qu'un objet JS. L'objet lui-même pourrait avoir des informations concernant l'erreur mais nous ne savons toujours pas immédiatement d'où elle vient. Pas très utile lorsque nous travaillons sur notre code et le débogage.
Dans chrome devtools ressemble à ceci:
Une erreur renvoyée avec l'objet Error nous donne une trace de pile lorsque nous le développons. Cela nous donne des informations précieuses d'où vient précisément l'erreur, ce qui est souvent une information précieuse lors du débogage de votre code. Notez en outre que l'erreur indique
[object Object]
cela est dû au fait que leError
constructeur attend une chaîne de message comme premier argument. Lorsqu'il reçoit un objet, il le contraindra en une chaîne.la source
Comportement de réaction
Outre le reste des réponses, je voudrais montrer une différence dans React.
Si je lance un
new Error()
et que je suis en mode développement, j'obtiendrai un écran d'erreur et un journal de console. Si je jette une chaîne littérale, je ne la verrai que dans la console et je pourrai la manquer, si je ne regarde pas le journal de la console.Exemple
Lancer une erreur se connecte à la console et affiche un écran d'erreur en mode développement (l'écran ne sera pas visible en production).
Alors que le code suivant se connecte uniquement à la console:
la source