Question

Ce serait une bonne façon de signaler des erreurs dans le code JavaScript au lieu de s'appuyer sur les valeurs null, et undefineds lorsque des erreurs se produisent et les fonction est pas en mesure d'aller de l'avant.Je peux penser à trois approches:

  1. ne rien faire
  2. lever une exception
  3. affirmer

Voici un simple exemple de scénario - une fonction que des crédits d'un compte d'utilisateur avec le montant passé en.La fonction credit fait partie d'un Account objet.

Voici la solution naïve.

function credit(amount) {
   this.balance += amount;
}

Un problème majeur avec cette approche n'est pas valide les données.Nous allons le corriger, et d'utiliser une valeur de retour pour indiquer que l'opération a échoué.

function credit(amount) {
    if(!isInt(amount)) {
        return false;
    }
    this.balance += amount;
}

C'est une amélioration par rapport à la précédente, mais le code client devra vérifier la valeur de retour pour s'assurer que l'opération a réussi.Faire cela pour chaque méthode dans le système peut devenir lourd.

if(!johnDoe.credit(100)) {
    // do some error handling here
}

Une troisième approche, similaire à la deuxième, est de lancer une exception.Puisque nous sommes en jetant l'exception de nous-mêmes, pourrait jeter un type spécifique de l'exception plutôt que générale.

function credit(amount) {
    if(!isInt(amount)) {
        throw new InvalidAmountError(amount);
    }
    this.balance += amount;
}

Une quatrième approche similaire à lever des exceptions est d'utiliser des assertions dans votre code.Une lacune par rapport à l'approche ci-dessus est que, depuis l'affirmer, c'est générique, nous perdons la capacité de jeter personnalisé exceptions.Il est possible cependant par le passage de l'objet à jeter dans chaque affirmer appel.

function credit(amount) {
    assert(!isInt(amount), "Amount to credit is not an integer");
    this.balance += amount;
}

Mondial assert la fonction est facile d'écrire et de rendre le code un peu plus court.

function assert(value, message) {
    if(value !== true) {
        throw new AssertionError(message);
    }
}

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

AssertionError.prototype.toString = function() {
    return 'AssertionError: ' + this.message;
}

En dehors de ces approches, ce serait une bonne façon de traiter avec des valeurs inattendues, et malheureux chemins.Existe-il d'autres approches ne sont pas mentionnés ici, qui pourraient être utiles?

Était-ce utile?

La solution

Envisager une journalisation côté client cadre de signaler des erreurs, telles que Log4js.On peut les messages du journal (c'est à dire, info, debug, warn, error) dans le navigateur ou persistent des messages au serveur via Ajax, en fonction de l'application.

Le Log4js site fournit également un liste des autres JavaScript journalisation des cadres.

Une bonne approche, à l'aide de votre exception personnalisée exemple, serait de jeter l'exception et le journal de l'erreur que vous voyez l'ajustement.

Autres conseils

Une lacune par rapport à la ci-dessus approche est que, depuis l'affirmer, c'est générique, nous perdons la capacité de jeter personnalisé exceptions

Pas nécessairement:

function assert(value,message,Exctype) {
    if(value !== true) throw new Exctype(message);
}

Les constructeurs sont des fonctions.Les fonctions sont de première classe, des valeurs.Libre à vous de passer 'em autour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top