2012-03-05 16 views
6

¿Cuál es la mejor manera en el nodo para manejar las expeciones no controladas que salen del código de nodo central? Tengo un proceso en segundo plano que ejecuta y rastrea contenido web y se ejecutará durante largos períodos de tiempo sin problemas, pero de vez en cuando ocurre una excepción inesperada y parece que no puedo manejarlo con gracia. El culpable habitual parece ser un problema de red (pérdida de conectividad) donde fallan las llamadas http que estoy realizando. Todas las funciones que he creado siguen el patrón de FUNCTION_NAME (error, returned_data), pero en las situaciones en las que se produce el error, no veo ninguna de las funciones que creé en la pila de llamadas que se imprime, sino que muestra algunos de los módulos de nodos centrales No estoy realmente preocupado por estos errores infrecuentes y su causa raíz, el propósito de esta publicación es simplemente tratar de encontrar una forma elegante de manejar estas excepciones.Manejo de excepciones de nodo

He intentado poner try/catch en el nivel superior de mi código donde todo se ejecuta pero parece que no captura estas excepciones. ¿Es una buena práctica en un nodo usar try/catch dentro de todas las funciones de nivel inferior que usan algún código central? ¿O hay alguna manera de capturar globalmente todas las excepciones no controladas?

Gracias

Chris

actualizado para añadir PILA

node.js:201 
     throw e; // process.nextTick error, or 'error' event on first tick 
      ^
Error: connect Unknown system errno 10060 
    at errnoException (net.js:642:11) 
    at Object.afterConnect [as oncomplete] (net.js:633:18) 
+0

¿Puedes copiar la pila de algunas de estas pilas de excepciones no detectadas? – seppo0010

+0

Acabo de agregar la impresión de la pila a la pregunta principal de uno de los errores recientes. Fue confuso para mí ya que no mostró ningún código dentro de él. –

+0

¿Qué versión de nodo estás usando? Pregunto porque los números de línea no coinciden con mi copia local. – seppo0010

Respuesta

4

¿hay alguna manera de forma global la captura de todas las excepciones no controladas?

Puede capturar todas las excepciones usando process.on ('uncaughtException'). Escuchar este evento evitará la acción predeterminada de imprimir la pila y salir. Sin embargo, tenga en cuenta que ignorar las excepciones puede ocasionar problemas en la ejecución de su aplicación.

Enlace: http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception

Preste atención a los consejos documentación:

Tenga en cuenta que uncaughtException es un mecanismo muy crudo para el manejo de excepciones. Usar try/catch en su programa le dará más control sobre el flujo de su programa. Especialmente para los programas de servidor que están diseñados para seguir funcionando para siempre, uncaughtException puede ser un mecanismo de seguridad útil.

1

Para detectar errores de red y evitar el comportamiento predeterminado (imprimir y salir de la pila), tiene que escuchar los eventos de "error".

Por ejemplo

var net = require('net'); 
var client = net.connect(80, 'invalid.host', function() { 
    console.log("Worked"); 
}) 
client.on('error', console.log); 
0

He creado un archivo rápido manejo de errores que registra y me manda un email cada vez que se produce una excepción no controlada. entonces (opcionalmente) intenta reiniciar el servidor.

Check it out!

1

Escribí sobre esto recientemente en http://snmaynard.com/2012/12/21/node-error-handling/. Una nueva característica del nodo en la versión 0.8 es dominios y le permite combinar todas las formas de manejo de errores en una sola forma de administración. Puede leer sobre ellos en mi publicación y en el docs.

Puede usar dominios para manejar argumentos de error de devolución de llamada, emisores de eventos de error y excepciones, todo en un solo lugar.El problema en este caso específico es que cuando no maneja un emisor de eventos de error, el nodo de forma predeterminada imprimirá el seguimiento de la pila y saldrá de la aplicación.