29 votes

Exceptions Javascript correctes pour les chaînes de caractères

D'une certaine manière, cela ne ressemble pas à l'aboutissement de 50 ans de développement de langages de programmation :

  throw "My exception message here";

Quelle est la façon correcte de faire des exceptions en Javascript, de sorte que

  • Ils peuvent être identifiés (instanceof)

  • Ils peuvent porter d'autres charges utiles que le message par défaut et la trace de la pile.

  • Elles "sous-classent" l'exception de base, de sorte que la console de débogage et autres peuvent extraire des informations significatives sur l'exception.

  • Possibilité d'exceptions imbriquées (conversion d'une exception en une autre) : si vous devez attraper une exception et en relancer une nouvelle, la trace de la pile originale sera préservée et pourra être lue de manière significative par les outils de débogage.

  • Ils suivent les meilleures pratiques Javascript

25voto

Raynos Points 82706

throw new Error("message");

ou si vous voulez être plus spécifique, utilisez l'un des éléments suivants Objets d'erreur

Il est important de s'assurer que vous lancez de vraies erreurs car elles contiennent la trace de la pile. Lancer une chaîne de caractères est stupide car aucune méta-donnée n'y est attachée.

Vous pouvez également sous-classer les erreurs

// for some sensible implementation of extend 
// https://gist.github.com/1441105#file_1pd.js
var MyError = extend(Object.create(Error.prototype), {
   ...
});

9voto

Sim Points 1117

Une "exception" de base en JavaScript est intégrée Error objet :

throw new Error("My exception message here");

Vous pouvez définir vos exceptions personnalisées comme :

function CustomError(message) {
  this.message = message;
}

CustomError.prototype = new Error();
CustomError.prototype.constructor = CustomError;

Vérifier le type d'exception avec instanceof . Il existe également un liste pratique d'exceptions intégrées .

3voto

Aleksandar Totic Points 1605

Vous ne pouvez pas le faire et satisfaire aux exigences de la question.

Pourquoi ?

Le problème est d'obtenir la pile. L'objet Native error (NativeError à partir de maintenant), initialise la pile lorsque son constructeur est appelé. Pour récupérer la pile dans MyError (votre sous-classe d'erreur), vous devez appeler le NativeConstructor dans le constructeur de MyError. Ainsi, votre classe MyError ressemble à quelque chose comme ceci :

function MyError(msg) {
    Error.call(this, msg);
}

Mais, cela ne fonctionne pas. Car selon HTML5 spéc :

"si vous appelez Error comme une fonction, elle renvoie un nouvel objet Error".

Au lieu que le constructeur de Error soit gentil et initialise votre classe d'erreur personnalisée, il crée un objet d'erreur dont vous n'avez pas l'utilité. Je n'ai pas trouvé de moyen d'appeler le constructeur de NativeError et de lui faire initialiser la sous-classe MyError.

Tout n'est pas perdu.

Si nous assouplissons les exigences de la question originale, et que nous oublions "instanceof" pour tester la classe d'exception (donc Java de toute façon), et que nous utilisons "name" à la place, c'est faisable. Il suffit de déclarer MyError comme :

function MyError(msg, customArg) {
    var e = new Error(msg);
    e.name = "MyError";
    e.custom = customArg;
    return e;
}

Voici ce que je fais. Au lieu d'activer "instanceof", activez "name" à la place.

2voto

Eliasdx Points 1272

Vous pouvez créer un Error en appelant l'objet Error Constructeur . Un site error Un objet peut avoir un message et un nom. Lors de la capture, vous pouvez vérifier un nom spécifique ou vous pouvez créer un type d'erreur personnalisé en héritant de l'attribut Error prototype. Cela permet d'utiliser instanceof de différer entre les différents types d'erreurs.

// Create a new object, that prototypally inherits from the Error constructor.  
function MyError(message) {  
    this.message = message || "Default Message";  
}  
MyError.prototype = new Error();  
MyError.prototype.constructor = MyError;  

try {  
    throw new MyError();  
} catch (e) {  
    console.log(e.name);     // "MyError"  
    console.log(e.message);  // "Default Message"  
}  

try {  
    throw new MyError("custom message");  
} catch (e) {  
    console.log(e.name);     // "MyError"  
    console.log(e.message);  // "custom message"  
}  

Exemple tiré de : https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error

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