Manejo de errores en Node.js

manejo de errores

Manejo de errores en Node.js

Manejo de errores — Hay infinitas formas de encontrar un error y no es fácil superarlas. A medida que producimos nuestro proyecto, queremos saber que ha sido cuidado y consolidado para cualquier confusión que pueda surgir.


Consideremos un escenario en el que creamos una API web RESTful con Node.js. Tenemos muchos usuarios que envían solicitudes de datos desde nuestro servidor. Suena bien. Por ahora…

Dado que personas de todo el mundo realizan solicitudes a nuestro servidor, es muy probable que obtengamos algún valor inesperado en nuestro programa. Y una vez que tengamos estos valores, queremos darles a nuestros usuarios una respuesta lo más descriptiva posible. Si no tenemos el manejo de errores adecuado de Node.js, lo más probable es que arrojemos un mensaje de error simple. El usuario probablemente verá el mensaje “Algo salió mal”.

manejo de errores

Ésta no es una buena práctica.

Para comprender bien el concepto de manejo de errores, es necesario comprender primero el objeto de error.

throw new Error('database failed to connect');

El primer argumento de un objeto de error nativo es su descripción. La descripción es la cadena legible por humanos de su objeto de error. Es lo que aparece en tu consola cuando algo sale mal.

throw new CustomError('A custom error');

Los segundos objetos de error también tienen una propiedad de nombre, que es la parte legible por computadora del objeto. Cuando utiliza el objeto de error nativo, la propiedad de nombre se establece de forma predeterminada en el genérico “Error”. , pero puedes crear el tuyo propio.

Crear un objeto de error no es el final para nosotros. Crear un objeto de error solo prepara metafóricamente nuestro error para enviar, pero no envía. Para enviar nuestro error, debemos lanzarlo. Pero, ¿qué significa tirar? ¿Y qué significa eso para nuestro programa?

Throw realmente hace dos cosas: detiene el programa y encuentra una captura para ejecutar.

Cuando JavaScript encuentra una palabra clave throw, lo primero que hace es detenerse en seco, lo que evita que se ejecuten más funciones. Al detenerse así, mitiga el riesgo de que se produzcan más errores y nos ayuda a no alterar el estado de nuestro programa.


Manejo de errores asincrónicos

Antes de profundizar demasiado, demos un paso atrás y comprendamos cómo JavaScript maneja las tareas asíncronas y por qué necesitamos hacer esto.

JavaScript es un lenguaje de programación de un solo subproceso. En virtud de tener un solo procesador, obtenemos código de bloqueo. El código de bloqueo se refiere a si su programa esperará a que se complete una tarea asíncrona antes de hacer cualquier otra cosa, mientras que el código de no bloqueo se refiere a dónde registra una devolución de llamada para realizar cuando se completa la tarea.

En este punto, vale la pena mencionar que hay dos formas principales de manejar async en JavaScript: promesas o devoluciones de llamada.

Las promesas manejan los errores con bastante elegancia y detectarán cualquier error que lo precedió en la cadena, lo cual es excelente para los programadores de Node.js, porque significa que podemos manejar muchos errores en muchas funciones en un solo controlador.

En este punto, es posible que se pregunte si agregar un truco a sus promesas es opcional. Es opcional, pero siempre debe proporcionar un controlador de captura.

Porque hay infinitas formas en que sus llamadas asíncronas pueden fallar. Nuestro código puede agotarse, puede tener problemas de red o puede haber una falla de hardware. Por todas estas razones, siempre debe indicar a su programa qué hacer en caso de incumplimiento de una promesa.

Recuerde la regla de oro: maneje siempre los rechazos de promesas.


Peligros del intento / captura asíncrono

Es posible que se haya estado preguntando por qué la promesa expone un método de captura y por qué no podemos simplemente envolver la implementación de nuestra promesa en un intento / captura. Si intentara hacer esto, los resultados no serían los esperados.

Try / catch es sincrónico por defecto. Eso significa que si una función asíncrona arroja un error en un bloque try / catch síncrono, no se arroja ningún error.

Definitivamente eso no es lo que queremos.

En resumen, si está manejando el manejo de errores asíncronos, realmente debería usar el manejador de captura de promesas, porque esto le permitirá manejar de manera efectiva los errores asíncronos. Pero si está tratando con código síncrono, el try / catch funcionará bien.

Recent Post