Est-il possible que des erreurs apparaissent dans les promesses?
Voir le code ci-dessous pour référence, je voudrais obtenir promise1.catch
pour attraper l’erreur générée dans promise2
(lequel courant ne fonctionne pas avec ce code):
function test() { var promise1 = new Promise(function(resolve1) { var promise2 = new Promise(function(resolve2) { throw new Error('Error in promise2!'); }); promise2.catch(function(error2) { console.log('Caught at error2', error2); }); }); promise1.catch(function(error1) { console.log('Caught at error1', error1); }); } test();
La propagation des erreurs dans les promesses est l’un de ses meilleurs atouts. Il agit exactement comme dans le code synchrone.
try { throw new Error("Hello"); } catch (e){ console.log('Caught here, when you catch an error it is handled'); }
Est très similaire à:
Promise.try(function(){ throw new Error("Hello"); }).catch(function(e){ console.log('Caught here, when you catch an error it is handled'); });
Tout comme dans le code séquentiel, si vous voulez appliquer une logique à l’erreur mais ne pas la marquer comme étant gérée, vous la relisez:
try { throw new Error("Hello"); } catch (e){ console.log('Caught here, when you catch an error it is handled'); throw e; // mark the code as in exceptional state }
Ce qui devient:
var p = Promise.try(function(){ throw new Error("Hello"); }).catch(function(e){ console.log('Caught here, when you catch an error it is handled'); throw e; // mark the promise as still rejected, after handling it. }); p.catch(function(e){ // handle the exception });
Notez que dans Bluebird, vous pouvez avoir saisi et capturé des captures conditionnelles. Par conséquent, si vous vous contentez de spécifier le type ou le contenu de la promesse pour décider de la traiter ou non, vous pouvez l’enregistrer.
var p = Promise.try(function(){ throw new IOError("Hello"); }).catch(IOError, function(e){ console.log('Only handle IOError, do not handle syntax errors'); });
Vous pouvez également utiliser .error
pour gérer OperationalError
qui proviennent d’API promisifiées. En général, OperationalError
signifie une erreur à laquelle vous pouvez remédier (par opposition à une erreur du programmeur). Par exemple:
var p = Promise.try(function(){ throw new Promise.OperationalError("Lol"); }).error(function(e){ console.log('Only handle operational errors'); });
Cela présente l’avantage de ne pas réduire TypeError
silence les erreurs de type et les erreurs de syntaxe de TypeError
dans votre code, ce qui peut être gênant en JavaScript.