Manejo de Errores Globales y Señales del Sistema en Node.js

Clase 16 de 26Curso de Node.js Avanzado

Resumen

Crear aplicaciones robustas en Node.js implica manejar adecuadamente errores globales y señales del sistema. Muchos desarrolladores pasan por alto los eventos globales que permiten controlar situaciones inesperadas, por eso es importante integrarlos y entenderlos para mantener la estabilidad de la aplicación.

¿Por qué usar eventos globales como uncaughtException?

El evento llamado uncaughtException permite capturar errores que no son controlados explícitamente dentro del código. Cuando se genera un error inesperado y no está dentro de un bloque que lo pueda manejar, este evento se dispara automáticamente informando sobre el error y evitando la caída descontrolada de la aplicación.

Para implementarlo, solo es necesario agregarlo al módulo process como sigue:

process.on('uncaughtException', (error) => {
    console.error('Se capturó un error no controlado:', error);
});

Esto facilita identificar exactamente dónde ha ocurrido el problema y corregirlo rápidamente.

¿Cuál es el beneficio de utilizar unhandledRejection?

El evento unhandledRejection detecta y controla rechazos de promesas que no tienen definidos eventos catch. Este tipo de rechazos son frecuentes en aplicaciones que utilizan promesas y pueden causar fallos inesperados.

Añadir este evento es sencillo:

process.on('unhandledRejection', (reason, promise) => {
    console.error('Promesa rechazada y no manejada:', reason);
});

Al contar con este control, es posible diagnosticar claramente los rechazos sin manejo explícito y mantener el funcionamiento continuo del servidor.

¿Cómo manejar señales del sistema para cierres controlados?

Las señales del sistema indican a la aplicación que realice una salida controlada, un cierre ordenado que mantenga la integridad de los procesos activos. Algunas señales comunes son:

  • SIGINT: Emitido cuando se presiona control C.
  • SIGTERM: Señal para terminar programas enviada por fuentes externas.

Implementarlas es posible escuchando cada señal y administrando el cierre:

['SIGINT', 'SIGTERM', 'SIGUSR1', 'SIGUSR2'].forEach((signal) => {
    process.on(signal, () => {
        console.log(`Recibida señal ${signal}`);
        process.exit(1); // Salida controlada indicando error.
    });
});

Este approach permite que la aplicación termine sus procesos limpiamente y en estado seguro al detectar cierres desde el sistema operativo.

Te invito a compartir tu experiencia controlando eventos globales y señales en tus proyectos Node.js; cuéntame cómo has solucionado errores inesperados o salidas abruptas hasta ahora.