nodejs dominios es la más actualizada de la manera de manejar los errores en nodejs. Los dominios pueden capturar el error/otros eventos así como tradicionalmente los objetos lanzados. Dominios también proporciona funcionalidad para el manejo de las devoluciones de llamada con un error del pasado como primer argumento a través de la intercepción de método.
Como con el normal try/catch-estilo de manejo de errores, es generalmente mejor para lanzar los errores cuando se producen, y el bloque de áreas donde se desea aislar los errores que se afecte el resto del código. El camino para "bloquear" estas áreas son : llamar a domain.run con una función como un bloque aislado de código.
En el código sincrónico, el de arriba es suficiente - cuando ocurre un error que cualquiera deje de ser lanzado a través de, o de coger y manejar allí, volviendo todos los datos que necesite para volver.
try {
//something
} catch(e) {
// handle data reversion
// probably log too
}
Cuando sucede el error asíncrono, devolución de llamada, usted necesita ser capaz de manejar por completo la reversión de datos (estado compartido de datos externos como bases de datos, etc.). O hay que configurar algo para indicar que una excepción que ha sucedido - donde quiera que usted se preocupa de que la bandera, usted tiene que esperar la llamada de vuelta a completar.
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
}
})});
Algunos de los que el código anterior es feo, pero usted puede crear patrones para hacer más guapa, por ejemplo:
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
});
ACTUALIZACIÓN (2013-09):
Anteriormente, yo uso un futuro que implica fibras de la semántica, la cual permite esperar en el futuro en-línea. Esta realidad permite el uso tradicional de los bloques try-catch para todo , lo que me parece ser el mejor camino a seguir. Sin embargo, no siempre se pueden hacer esto (es decir, en el navegador)...
También hay futuros que no requieren de las fibras de la semántica (que, a continuación, trabajar con normalidad, browsery JavaScript). Estos pueden ser llamados futuros, promesas, o deferreds (voy a referir a los futuros, a partir de aquí). Llano-viejo-JavaScript futuros de las bibliotecas de permitir que los errores se propagan entre futuros. Sólo algunas de estas bibliotecas permiten a cualquier lanzado el futuro a ser manejados correctamente, así que ten cuidado.
Un ejemplo:
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()
Esto imita normal try-catch, aunque las piezas son asincrónicas. Sería de impresión:
1
2
handler
Tenga en cuenta que no print '3', porque se produce una excepción que interrumpe el flujo.
Eche un vistazo a estas bibliotecas:
Tenga en cuenta que no he encontrado muchas otras bibliotecas de estos que manejan correctamente lanzado excepciones. jQuery diferido, por ejemplo, no se - el "error" controlador nunca tendrían la excepción de un 'entonces' controlador, que en mi opinión es un interruptor.