2017-10-05 1 views
0

Comment gérer vos propres erreurs générées avec des exceptions bibliothèque/non gérées dans les promesses Javascript? Le problème auquel je suis confronté est généré par la nature "fourre-tout" de la méthode des promesses catch().Promise manipulé les erreurs

Par exemple, j'ai le code suivant:

somePromiseFunction() 
.then(result => { 
    // External library or behaviour 
    someCodeThatCanThrowExceptions() 

    if (result.code === 1) { 
     throw 'My own exception' 
    } 
}) 
.catch(err => { 
    // how do I know if this is an exception I don't know or something 
    // that I do want to actually handle? 
}); 

Beaucoup de choses peuvent mal tourner dans la chaîne then(), les bibliothèques externes peuvent lancer des exceptions et ainsi de suite. Par exemple, je veux imprimer "Erreur générique" quand quelque chose comme ça arrive.

Mais je veux aussi valider le code et sortir tôt (comme je le fais dans l'exemple) et dans ce cas, imprimer mon propre message "Ma propre erreur".

Comment gérer à la fois mon "exit early" throw s et toutes les choses différentes qui peuvent mal se passer pendant l'exécution du code?

+1

Est-il suffisant d'avoir du code dans le fichier .catch qui vérifie 'if (err === 'Ma propre exception')' suivi de votre gestionnaire personnalisé, suivi d'un autre avec le gestionnaire général? –

+0

Ne pas promouvoir [cette bibliothèque] (https://github.com/AlexanderMac/n-custom-errors), mais il fait ce dont vous avez besoin. Donne la possibilité d'enregistrer des erreurs personnalisées et de vérifier que l'erreur lancée est une erreur personnalisée. – alexmac

+0

[Ne lancez jamais de chaînes.] (Https://stackoverflow.com/a/26020867/1048572) – Bergi

Répondre

1

Dans votre cas spécifique, vous lancez une exception de chaîne simple, vous devrez donc regarder la valeur.

function go() { 
    return new Promise(function(resolve, reject) { 
    throw 'My Exception'; 
    }); 
} 

const x = go() 
    .then(function() { 

    }) 
    .catch(function(ex) { 
    if (ex === 'My Exception') { 
     alert('It was mine'); 
    } 
    }); 

Si vous créez des exceptions plus spécialisées, vous pouvez tester le type plutôt que la chaîne exacte. Voici un exemple avec une exception qui suit le modèle window.Error (il a un nom et un message) qui peut être éprouvés:

var MyError = (function() { 
    function MyError(message) { 
    this.message = message; 
    this.name = 'MyError'; 
    } 
    return MyError; 
}()); 

function go() { 
    return new Promise(function(resolve, reject) { 
    throw new MyError('Something went wrong'); 
    }); 
} 

const x = go() 
    .then(function() { 

    }) 
    .catch(function(ex) { 
    if (ex instanceof MyError) { 
     alert('It was mine'); 
    } 
    }); 

Cela a l'avantage de découplage votre message de votre test pour déterminer si elle est votre erreur ou non.