RSS Feed

Una excepción y chau proceso

10

junio 14, 2012 by - @pjnovas

Bueno, no sé si te pasó antes, pero si ocurre una excepción no manejada, corta el proceso :P
Por ejemplo: tenemos nuestro WebServer genial corriendo en NodeJS y algo se nos pasó, algo que no esperabamos o alguna libreria explotó … chau server, se cae el proceso de NodeJS y por lo tanto nuestro WebServer muere con el :(

Eso no suena nada bien …

Fuera de que el try y el catch son nuestros amigos, cometemos errores y hay situaciones en las que se nos pasa, y tampoco podemos garantizar los catcheos de excepciones de todas las librerias que usamos.

Entonces, cual sería el nivel más alto para poner un try catch?: el objeto global process … ahí es cuando aparece un gran y maravilloso “try catch” para el proceso que nos puede “garantizar” (notese las comillas :P) que no se caiga al momento de explotar en mil colores:

process.on("uncaughtException", function (err) { 
  console.log('Seee voló en mil pedazos, pero el proceso sigue arriba');
  console.log('Exception: ' + err.stack);
});

Nos suscribimos al evento “uncaughtException” del process y a partir de ahi nos queda logear o hacer lo que creamos necesario al momento de una explosión no calculada.

Documentación de Node para Process Event Uncaughtexception

Librerías interesantes

Pero eso no es todo: como dije antes nos “garantiza”, pero entre comillas. Para estar completamente seguros tenemos alguna librerias:

Nodemon
Para ambiente de desarrollo, Nodemon vigila los archivos y si alguno se modifica re inicia le proceso
Forever
Una herramienta para asegurarnos que nuestro proceso corra por siempre, si cae vuelve arriba (se pueden configurar la cantidad de intentos y tambien usarlo dentro de la app NodeJS)
Node Supervisor
Basicamente hace lo mismo que las dos anteriores. Por linea de comando seteamos parámetros para vigilar, re-start onError, etc.
LearnBoost: Up
Otra opcion piola de parte de LearnBoost

Yo no probé ninguna y estoy con ganas de arrancar, usaste alguna de esas?, otra?


  • matiasarriola

    Piola! justo estaban hablando de estos temas en el grupo de javascript en google https://groups.google.com/forum/?fromgroups#!topic/javascript-arg/Bbfjfs07wz4
    Saludos

    • pjnovas

      Upa!, piola eso … voy a agregar algunas mensionadas ahi a este post :)

    • pjnovas

      Upa!, piola eso … voy a agregar a este post algunas de las mencionadas ahi :)

  • http://twitter.com/dzajdband Dan Zajdband

    Habria que agregar Up de learnboost entre las librerias: https://github.com/LearnBoost/up

    • pjnovas

      Agregada ;)

  • http://twitter.com/demianr85 Demián Rodriguez

    Hacer eso es medio de villero, es casi imposible seguir el programa una vez que ocurre una exception.
    Sin embargo hay una nueva api interesante: http://nodejs.org/docs/v0.7.10/api/domain.html

    • pjnovas

      No se si tomarlo como villero, depende el tipo de explosion… hablando desde el punto de un WebServer, por ej, con Express y lo comparas con un Apache o IIS, me suena extraño que falle algo en la app y se baje el servidor completo.

      Muy buena la de Domain!, hay que esperar un poco para tenerla ya que esta verde, pero va a ayudar mucho en el tema por lo que leo. ;)

    • http://twitter.com/dzajdband Dan Zajdband

      Justamente una uncaught exception es una excepción que no sabemos bien que pasa. Si tenes una app corriendo en producción probablemente no quieras que todo caiga por algún factor desconocido. Lo mejor en este caso (node 0.7.9 no es estable) es usar el handler del que habla Pablo y alertar adecuadamente sobre el error.

      Pensá que no solo puede ser un error tuyo sino también de cualquier otro modulo que estes usando.

      saludos.

  • Bruno

    Forever es bastante bueno pero te agrega un poco “overhead” si lo usas. Un proceso de node tipico con Forever esta duplicado minimo dos veces y consume al rededor de 2% de ram (En un VPS humilde con 512mb).

    Por ahi es un tema de mi server, pero por ejemplo asi esta ahora.

    • pjnovas

      Buena data! … gracias por el aporte!