nodejs domaines est la plus à jour la manière de gérer les erreurs dans nodejs. Domaines peut capturer à la fois d'erreur/d'autres événements ainsi que, traditionnellement, jeté des objets. Domaines également fournir des fonctionnalités de manipulation des rappels avec une erreur passé comme premier argument par l'ordonnée à l'origine de la méthode.
Comme avec les try/catch-style de gestion d'erreur, est généralement préférable de jeter les erreurs lorsqu'elles se produisent, et de bloquer les zones où vous souhaitez isoler les erreurs d'affecter le reste du code. Le moyen de "bloquer" ces zones sont à l'appel de domaine.courir avec une fonction comme un bloc isolé du code.
Dans le code synchrone, le ci-dessus est assez - lorsqu'une erreur se produit soit vous vous permettez d'être jeté à travers, ou que vous l'attraper et à manipuler-il, en se retournant toutes les données dont vous avez besoin pour revenir.
try {
//something
} catch(e) {
// handle data reversion
// probably log too
}
Lorsque l'erreur se produit dans un rappel asynchrone, vous devez être en mesure de gérer complètement la restauration des données (état partagé, de données externes comme les bases de données, etc). OU vous devez mettre quelque chose pour indiquer qu'une exception s'est passé - où jamais vous vous souciez de ce drapeau, vous devez attendre pour l'exécution du rappel.
var err = null;
var d = require('domain').create();
d.on('error', function(e) {
err = e;
// any additional error handling
}
d.run(function() { Fiber(function() {
// do stuff
var future = somethingAsynchronous();
// more stuff
future.wait(); // here we care about the error
if(err != null) {
// handle data reversion
// probably log too
}
})});
Certains de code ci-dessus est moche, mais vous pouvez créer des modèles pour vous-même pour le rendre plus joli, par exemple:
var specialDomain = specialDomain(function() {
// do stuff
var future = somethingAsynchronous();
// more stuff
future.wait(); // here we care about the error
if(specialDomain.error()) {
// handle data reversion
// probably log too
}
}, function() { // "catch"
// any additional error handling
});
Mise à JOUR (2013-09):
Ci-dessus, j'utilise un avenir qui implique des fibres de la sémantique, qui vous permettent de vous attendre sur les contrats à terme en ligne. Cela vous permet d'utiliser les blocs try-catch pour tout ce - que je trouve la meilleure façon d'aller. Cependant, on ne peut pas toujours le faire (c'est à dire dans le navigateur)...
Il existe également des contrats à terme qui ne nécessitent pas de fibres sémantique (qui travaillent ensuite avec la normale, browsery JavaScript). Ceux-ci peuvent être appelés contrats à terme, des promesses, ou deferreds (je vais juste faire référence à des contrats à terme à partir d'ici). Plaine-de-vieille-JavaScript futures bibliothèques permettent d'être des erreurs propagées entre les contrats à terme. Seuls certains de ces bibliothèques permettent à tout jeté l'avenir pour être traités correctement, alors méfiez-vous.
Un exemple:
returnsAFuture().then(function() {
console.log('1')
return doSomething() // also returns a future
}).then(function() {
console.log('2')
throw Error("oops an error was thrown")
}).then(function() {
console.log('3')
}).catch(function(exception) {
console.log('handler')
// handle the exception
}).done()
Cette imite normale try-catch, même si les morceaux sont asynchrones. Il serait d'impression:
1
2
handler
Notez qu'il n'a pas l'impression de " 3 " parce que une exception a été levée qui interrompt le flux.
Jetez un oeil à ces bibliothèques:
Notez que je n'ai pas trouvé beaucoup d'autres bibliothèques autres que celles qui traitent correctement les exceptions lancées. jQuery est différé, par exemple, ne sont pas - le "fail" de gestionnaire ne pourrait jamais obtenir les exceptions lancées une à une", puis " gestionnaire, qui à mon avis est un briseur d'affaire.