645 votes

JavaScript, quelle est la différence de jeter la nouvelle erreur et throw(object)

Je veux écrire une commune gestionnaire d'erreur qui va attraper les erreurs personnalisées jeté sur le but à n'importe quelle instance du code.

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

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

Journal affiche: dans firefox Error: [object Object] et je n'arrivais pas à analyser l'objet.

Pour la deuxième jeter le journal indique que: Error: hehe

Alors que quand je l'ai fait

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

la console a montré que: Object { hehe="haha"} en qui j'ai été en mesure d'accéder à l'erreur propriétés.

Quelle est la différence?

Est la différence comme on le voit dans le code? comme la chaîne de caractères sera juste passé en tant que chaîne et de l'objet en tant qu'objets, mais la syntaxe sera différent?

Je n'ai pas exploré jeter objet d'erreur... j'avais fait seulement jeter des cordes.

Est-il un autre moyen que les deux ci-dessus mentionné méthodes?

Vos suggestions s'il vous plaît.

345voto

Hemant Metalia Points 8325

voici une bonne explication sur L'Erreur de l'objet et de lancer vos propres erreurs

L'Objet D'Erreur

juste ce que l'on peut extraire dans un cas d'erreur. L'Erreur de l'objet dans tous les navigateurs prennent en charge les deux propriétés suivantes:

  • nom: Le nom de l'erreur, ou, plus précisément, le nom de la fonction constructeur de l'erreur appartient.

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

Six valeurs possibles peuvent être retournés par le nom de la propriété, qui, comme mentionné correspondent aux noms de l'erreur de constructeurs. Ils sont les suivants:

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 vos propres erreurs (exceptions)

Au lieu d'attendre pour l'un des 6 types d'erreurs se produisent avant que le contrôle est transféré automatiquement à partir du bloc try pour le bloc catch, vous pouvez également explicitement lancer votre propre exceptions à la force que pour se produire sur demande. C'est idéal pour créer vos propres définitions de ce qu'est une erreur et quand de contrôle doivent être transférés à attraper.

88voto

Ed . Points 2160

L'article qui suit va peut-être dans plus de détails à ce qui est un 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/

Il suggère que le dernier (new Error()) est plus fiable, puisque les navigateurs Internet comme Internet Explorer et Safari (pas sûr de versions) ne pas analyser correctement le message lors de l'utilisation de l'ancien.

Cela risquerait de provoquer une erreur sera levée, mais pas tous les navigateurs de répondre de la façon que vous attendez. Firefox, Opera et Chrome chaque affichage d'une "exception non interceptée" message et ensuite inclure la chaîne de message. Safari et Internet Explorer simplement jeter un "uncaught exception" d'erreur et de ne pas fournir à la chaîne de message à tous. Clairement, c'est sous-optimale à partir d'un débogage point de vue.

46voto

HappyHamburger Points 49

Tout d’abord, vous mentionnez ce code :

et puis vous écrivez dans votre premier exemple :

Le premier objet erreur fonctionnerait réellement, parce qu’il s’attend à une valeur de chaîne, en l’occurrence « échantillon ». Le second serait pas parce que vous essayez de passer un objet dans, et il s’attend à une chaîne.

L’objet error aurait la propriété de « message », qui serait « échantillon ».

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X