Bonne utilisation des erreurs


156

J'utilise TypeScript pour un projet raisonnablement important et je me demande quelle est la norme pour l'utilisation de Errors. Par exemple, disons que je donne une exception d'index hors limites en Java:

throw new IndexOutOfBoundsException();

La déclaration équivalente dans TypeScript serait-elle:

throw new Error("Index Out of Bounds");

De quelles autres manières pourrais-je accomplir cela? Quelle est la norme acceptée?

Réponses:


166

Quelqu'un a publié ce lien vers le MDN dans un commentaire, et je pense que cela a été très utile . Il décrit très soigneusement des choses comme ErrorTypes.

EvalError --- Crée une instance représentant une erreur qui se produit concernant la fonction globale eval ().

InternalError --- Crée une instance représentant une erreur qui se produit lorsqu'une erreur interne dans le moteur JavaScript est générée. Par exemple, "trop ​​de récursivité".

RangeError --- Crée une instance représentant une erreur qui se produit lorsqu'une variable numérique ou un paramètre est en dehors de sa plage valide.

ReferenceError --- Crée une instance représentant une erreur qui se produit lors du déréférencement d'une référence non valide.

SyntaxError --- Crée une instance représentant une erreur de syntaxe qui se produit lors de l'analyse du code dans eval ().

TypeError --- Crée une instance représentant une erreur qui se produit lorsqu'une variable ou un paramètre n'est pas d'un type valide.

URIError --- Crée une instance représentant une erreur qui se produit lorsque encodeURI () ou decodeURI () reçoivent des paramètres non valides.


Il semble qu'il manque un type plus général pour l' argument invalide . Tous les arguments invalides ne relèvent pas RangeError. Devez-vous définir des types personnalisés ou simplement throw new Error("<message>");?
anddero

58

La convention pour hors de portée en JavaScript utilise RangeError. Pour vérifier le type, utilisez if / else + instanceofdu plus spécifique au plus générique

try {
    throw new RangeError();
}
catch (e){
    if(e instanceof RangeError){
        console.log('out of range');
    }
}

2
Et une erreur générale? Et / ou où est la liste des classes d'erreur JS intégrées?
pitosalas le

7
Il existe une liste des types d'erreur JavaScript et d'autres informations sur Mozilla Developer Network: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Christian Davén

6
@basarat Je pense que vous devriez ajouter else { throw; }ici
knocte

44

Solution simple pour émettre et afficher le message par Exception.

try {
  throw new TypeError("Error message");
}
catch (e){
  console.log((<Error>e).message);//conversion to Error type
}

Mise en garde

Ci-dessus n'est pas une solution si nous ne savons pas quel type d'erreur peut être émis par le bloc. Dans de tels cas, des protections de type doivent être utilisées et une gestion correcte des erreurs doit être effectuée - jetez un œil à la réponse @Moriarty.


Merci pour le pointeur vers la conversion de type explicite. Je n'ai pas trouvé cette information dans le Typescript-Docs et j'ai appris quelque chose aujourd'hui.
JackLeEmmerdeur

savez-vous quel est le but d'ajouter <Error>? e.message fonctionne très bien pour moi.
sbattou

1
@sbattou le seul but de <Error>est de dire au compilateur TS equ'ici est de type <Error>afin que vous ayez (1) intellisense et (2) une meilleure vérification de type. Sachez cependant que toute distribution ne se traduit pas du tout en JS et est purement du sucre syntaxique.
Didii

25

N'oubliez pas les instructions switch:

  • Assurer la manipulation avec default.
  • instanceof peut correspondre à la superclasse.
  • ES6 constructorcorrespondra à la classe exacte.
  • Plus facile à lire.

function handleError() {
    try {
        throw new RangeError();
    }
    catch (e) {
        switch (e.constructor) {
            case Error:      return console.log('generic');
            case RangeError: return console.log('range');
            default:         return console.log('unknown');
        }
    }
}

handleError();


3
C'est bien; semble plus robuste et plus propre que les autres réponses.
Victor Zamanian
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.