Quelles sont les pratiques standard pour lancer des exceptions JavaScript?

W3schools indique que les exceptions peuvent être des chaînes, des entiers, des booléens ou des objets, mais l'exemple donné ne me paraît pas une bonne pratique, car la vérification des types d'exceptions se fait par comparaison de chaînes. Est-ce la méthode privilégiée de gestion des exceptions en JavaScript? Existe-t-il des types d'exception intégrés (comme NullPointerException)? (Si oui, quels sont-ils, quel genre d'héritage utilisent-ils, et sont-ils préférés aux autres options?)

Les exceptions peuvent être tout ce que vous voulez.

Dans d'autres langues, les exceptions devraient être des instances, puis la déclaration de catch choisit les exceptions à capturer et à laisser passer par la classe de l'instance.

JavaScript, cependant, n'a pas cette fonctionnalité. Vous ne pouvez qu'observer toutes les exceptions, puis regarder la valeur pour décider quoi faire avec elle. Si vous ne souhaitez pas gérer une exception, vous devez relancer manuellement la valeur saisie. (Cela rend inévitablement catch relevés des catch plutôt désordonnés.)

Vous pouvez décider de mettre en œuvre vos exceptions en tant qu'objets et les comparer avec instanceof . Ou vous pourriez avoir des valeurs opaques uniques à comparer. Ou vous pouvez même lancer des chaînes ou des nombres droits si vous voulez vraiment.

Existe-t-il des types d'exception intégrés (comme NullPointerException)?

Genre de. ECMAScript définit certaines classes d'erreur standard: Error et ses sous-types EvalError , RangeError , ReferenceError , SyntaxError , TypeError , URIError . Cependant, il existe des problèmes d'implémentation de navigateur, par exemple, try { nonexistentvar; } try { nonexistentvar; } Donne TypeError sous IE au lieu de ReferenceError . Et il existe de nombreuses autres exceptions spécifiques au navigateur, en particulier lorsqu'il s'agit de DOM.

Il n'est pas traditionnel d'utiliser directement ces objets, et essayer de les sous-classer est désordonné (puisque JavaScript n'a pas de système de classe en tant que tel). Vous auriez tendance à respecter vos propres exceptions définies pour l'utilisation de vos propres applications à la place. Les exceptions ne sont pas très utilisées dans JavaScript.

La section 15.11 de la spécification ECMA-262 définit plusieurs types d' Error qui "sont lancés comme des exceptions lorsque des erreurs d'exécution se produisent … [ils] peuvent également servir d'objets de base pour des classes d'exceptions définies par l'utilisateur". Cette spécification définit également six autres types d'erreur qui font partie de la langue.

Il semble préférable de lancer des exceptions de ces types (ou des types dérivés d'eux) car il est plus facile de déterminer leur type; Ils ont également une propriété de message intégrée.

Dans ma propre expérience, les blocs try / catch sont quelque peu rares et se sentent vraiment exceptionnels, par opposition à être inévitables comme en Java.

Vous pouvez essayer le projet de base de Dean Edwards. Il émule l'héritage de classe dans javascript, donc l'utiliser pourrait vous permettre de sous-classer le type d'erreur. Vous ne pouvez pas attraper différents types d'erreurs dans javascript (car ce n'est pas une langue typée), mais vous pouvez déterminer le type d'erreur qui a été lancé et ajouter une logique pour ce type spécifique, de la manière suivante:

 try { // do something } catch (e) { if (e instanceof NullPointerError) { // handle nullpointer exception } else if (e instanceof RuntimeError) { // handle runtime exception } else { // regular exception } } 

Bien sûr, dans ce code, je suppose que vous avez déclaré les classes NullPointerError et RuntimeError comme sous-classes d'Erreur.