web-dev-qa-db-fra.com

Utilisation correcte des erreurs

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

throw new IndexOutOfBoundsException();

L'instruction équivalente dans TypeScript serait-elle:

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

Quels autres moyens pourrais-je accomplir cela? Quelle est la norme acceptée?

132
Nathan Bellowe

Quelqu'un a posté ce lien vers le MDN dans un commentaire et je pense que cela a été très utile . Il décrit des choses comme ErrorTypes de manière très détaillée.

EvalError --- Crée une instance représentant une erreur survenant pour la fonction globale eval ().

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

RangeError --- Crée une instance représentant une erreur qui se produit lorsqu'une variable ou un paramètre numérique se situe 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 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 se produisant lorsque des paramètres non valides sont transmis à encodeURI () ou à decodeURI ().

145
Nathan Bellowe

La convention pour JavaScript en dehors de la plage utilise RangeError. Pour vérifier le type, utilisez if/else + instanceof en commençant par le plus spécifique au plus générique.

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

Solution simple pour émettre et afficher un message par exception.

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

Mise en garde

Ce qui précède n’est pas une solution si nous ne savons pas quel type d’erreur peut être émis par le bloc. Dans de tels cas, il convient d'utiliser des gardes et de gérer correctement les erreurs - jetez un coup d'œil à la réponse @Moriarty.

38
Maciej Sikora

N'oubliez pas les instructions switch:

  • Assurer la manipulation avec default.
  • instanceof peut correspondre à la superclasse.
  • ES6 constructor correspondra à 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();
12
Moriarty