web-dev-qa-db-fra.com

Quelle est la différence entre `throw new Error` et` throw someObject`?

Je veux écrire un gestionnaire d'erreurs commun qui interceptera les erreurs personnalisées générées intentionnellement à n'importe quelle instance du code.

Quand j'ai fait throw new Error('sample') comme dans le code suivant

try {
    throw new Error({'hehe':'haha'});
    // throw new Error('hehe');
} catch(e) {
    alert(e);
    console.log(e);
}

Le journal montre dans Firefox comme Error: [object Object] et je ne pouvais pas analyser l’objet.

Pour le second throw, le journal indique: Error: hehe

Alors que quand j'ai fait

try {
    throw ({'hehe':'haha'});
} catch(e) {
    alert(e);
    console.log(e);
}

la console s’affiche sous la forme: Object { hehe="haha"} dans laquelle j’ai pu accéder aux propriétés de l’erreur.

Quelle est la différence?

La différence est-elle comme dans le code? Comme chaîne sera simplement passé comme chaîne et objet comme objet mais la syntaxe sera différente?

Je n’ai jamais exploré le fait de lancer un objet d’erreur… Je n’avais fait que lancer des ficelles.

Existe-t-il un autre moyen que les deux méthodes susmentionnées?

314
Jayapal Chandran

Voici une bonne explication sur l'objet Error et ses propres erreurs

L'objet d'erreur

Que pouvons-nous en extraire en cas d'erreur? L'objet Error de tous les navigateurs prend en charge les deux propriétés suivantes:

  • name: nom de l'erreur, ou plus spécifiquement, le nom de la fonction de constructeur à laquelle l'erreur appartient.

  • message: description de l'erreur, cette description variant en fonction du navigateur.

Six propriétés possibles peuvent être renvoyées par la propriété name qui, comme mentionné, correspond aux noms des constructeurs de l'erreur. Elles sont:

Error Name          Description

EvalError           An error in the eval() function has occurred.

RangeError          Out of range number value has occurred.

ReferenceError      An illegal reference has occurred.

SyntaxError         A syntax error within code inside the eval() function has occurred.
                    All other syntax errors are not caught by try/catch/finally, and will
                    trigger the default browser error message associated with the error. 
                    To catch actual syntax errors, you may use the onerror event.

TypeError           An error in the expected variable type has occurred.

URIError            An error when encoding or decoding the URI has occurred 
                   (ie: when calling encodeURI()).

Lancer ses 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 lancer explicitement vos propres exceptions pour forcer l'exécution de cette action à la demande. C'est très bien pour créer vos propres définitions de ce qu'est une erreur et à quel moment le contrôle doit être transféré à catch.

195
Hemant Metalia

jeter "je suis le mal"

Throw va terminer la suite de l'exécution et exposer la chaîne de message sur catch l'erreur.

try{
    throw 'I\'m Evil'
    console.log('You\'ll never reach to me', 123465)
}
catch(e){
    console.log(e); //I\'m Evil
}

La console après projection ne sera jamais atteinte, ce qui entraînera la résiliation.

jeter une nouvelle erreur ("Je suis si gentil")

lance une nouvelle erreur expose un événement d'erreur avec deux paramètres nom & message. Il met également fin à une exécution ultérieure

try{
     throw new Error('I\'m Evil')
     console.log('You\'ll never reach to me', 123465)
}
catch(e){
        console.log(e.name, e.message); //Error, I\'m Evil
}
72
Nishchit Dhanani

L'article suivant explique peut-être plus précisément lequel est le meilleur choix. throw 'An error' ou throw new Error('An error'):

http://www.nczonline.net/blog/2009/03/10/the-art-of-throwing-javascript-errors-part-2/

Cela suggère que le dernier (new Error()) est plus fiable, car des navigateurs comme Internet Explorer et Safari (incertain des versions) ne signalent pas correctement le message lorsqu’on utilise le premier.

Cela provoquerait une erreur, mais tous les navigateurs ne répondent pas comme vous le souhaitiez. Firefox, Opera et Chrome affichent chacun un message "exception non interceptée", puis incluent la chaîne de message. Safari et Internet Explorer génèrent simplement une erreur "exception non capturée" et ne fournissent pas la chaîne du message. Clairement, cela n’est pas optimal du point de vue du débogage.

69
Ed .

Vous mentionnez d'abord ce code:

throw new Error('sample')

et dans votre premier exemple, vous écrivez:

throw new Error({'hehe':'haha'}) 

Le premier objet Error fonctionnerait réellement, car il attend une valeur de chaîne, dans le cas présent, "échantillon". La seconde ne le ferait pas car vous essayez de passer un objet et attend une chaîne.

L'objet d'erreur aurait la propriété "message", qui serait "échantillon".

32
IonicBurger

vous pouvez throw comme objet

throw ({message: 'This Failed'})

alors par exemple dans votre try/catch

try {
//
} catch(e) {
    console.log(e); //{message: 'This Failed'}
    console.log(e.message); //This Failed
}

ou tout simplement jeter une erreur de chaîne

throw ('Your error')

try {
//
} catch(e) {
    console.log(e); //Your error
}

throw new Error //only accept a string
6
Mbanda

TLDR: ils sont équivalents.

// this:
const x = Error('I was created using a function call!');
​​​​// has the same functionality as this:
const y = new Error('I was constructed via the "new" keyword!');

source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error

6
David Dehghan

Le constructeur Error permet de créer un objet d'erreur. Les objets d'erreur sont renvoyé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 renvoyées via l'instruction throw. le contrôle du programme sera passé au premier bloc catch de la pile d'appels.

Différence entre le rejet d'une erreur avec et sans l'objet Error:


throw {'hehe':'haha'};

Dans chrome, devtools ressemble à ceci:

enter image description here

Chrome nous dit que nous avons une erreur non interceptée qui est simplement un objet JS. L'objet lui-même pourrait avoir des informations concernant l'erreur mais nous ne savons toujours pas d'où vient l'erreur. Ce n'est pas très utile lorsque nous travaillons sur notre code et le déboguons.


throw new Error({'hehe':'haha'}); 

Dans chrome, devtools ressemble à ceci:

enter image description here

Une erreur générée avec l'objet Error nous fournit une trace de la pile lorsque nous l'étendons. Cela nous donne des informations précieuses sur l’origine précise de l’erreur, souvent utile lors du débogage de votre code. Notez en outre que l'erreur indique [object Object], car le constructeur Error attend une chaîne de message comme premier argument. Quand il reçoit un objet, il le contraint dans une chaîne.

2
Willem van der Veen