‫Instructor: ¡Está bien!
‫Y ahora, para terminar
‫esta sección, aprendamos a detectar excepciones no detectadas.
‫Pero, ¿qué son exactamente las excepciones no detectadas?
‫Bueno, todos los errores, o llamémoslos también bugs, que ocurren
‫en nuestro código síncrono pero
‫que no se manejan en ninguna parte se llaman excepciones no detectadas.
‫Y al igual que antes, al igual que con los rechazos no controlados,
‫también tenemos una forma de manejar las excepciones no detectadas.
‫Permítanme mostrarles rápidamente un
‫ejemplo de una excepción no detectada.
‫Así que simplemente finjamos que estamos tratando
‫de consolar. registrar algo que no existe.
‫Y de inmediato, obtenemos este error aquí, x no está definido, y luego,
‫de manera predeterminada, obtenemos este seguimiento de pila completo aquí
‫impreso en la consola.
‫Está bien.
‫Y ahora, para arreglar esto, esto es muy similar a hacer los
‫rechazos no manejados.
‫De nuevo, estamos escuchando un evento, esta
‫vez se llama uncaughtException.
‫Y, por supuesto, debe estar entre comillas.
‫Y luego, como antes, pasamos nuestra función de devolución de llamada.
‫Bueno.
‫Y ahora, en realidad, lo que estamos haciendo aquí es muy similar
‫a lo que hicimos aquí.
‫Así que queremos bloquear el error en
‫la consola para que luego aparezca en los registros de nuestro servidor, ¿de acuerdo?
‫Entonces, dándonos una forma de solucionar el problema.
‫Y luego queremos cerrar correctamente el servidor.
‫Entonces, bueno, en realidad aquí
‫quiero imprimir el error completo en la consola,
‫y no solo el mensaje, ¿de acuerdo?
‫Y también cambiemos el orden aquí, pero
‫eso es todo.
‫Entonces el resto es el mismo.
‫¡Y
‫aquí está, por supuesto, una EXCEPCIÓN SIN ATENCIÓN!
‫Ahora podría refactorizar esto aquí en una buena
‫función, pero manténgalo así, ¿de acuerdo?
‫Bien, ahora volvamos a ejecutar esto.
‫Entonces, echemos un vistazo a lo que tenemos aquí.
‫¡Y de hecho, ahora vemos una EXCEPCIÓN SIN ATENCIÓN!
‫Apagando.
‫¿Está bien?
‫Y de hecho, esto vuelve a imprimir toda la pila
‫en la consola, pero realmente no quiero eso.
‫No me gusta eso.
‫Así que volvamos a lo que teníamos aquí.
‫Así que err. nombre y luego err. mensaje.
‫Bien, y ahora tenemos
‫el ReferenceError que x no está definido, ¿de acuerdo?
‫Y pongamos lo mismo aquí.
‫Así como era antes.
‫Está bien.
‫Y eso es todo lo
‫que hay que hacer para detectar excepciones no detectadas.
‫Ahora, mientras estamos aquí en el rechazo no
‫controlado, bloquear la aplicación como lo hicimos aquí es
‫opcional, cuando hay una excepción no
‫detectada, realmente, realmente necesitamos bloquear nuestra aplicación porque después de que
‫hubo una excepción no detectada, todo el proceso
‫del nodo está en
‫un estado tan -Llamado estado inmundo, ¿de acuerdo?
‫Y para solucionar eso, el proceso debe terminar
‫y luego reiniciarse, ¿de acuerdo?
‫Y nuevamente, en
‫producción, deberíamos tener una herramienta en
‫su lugar que reiniciará la aplicación después de fallar.
‫Y muchos servicios de alojamiento ya lo hacen
‫de inmediato, ¿de acuerdo?
‫Entonces, de forma completamente automática sin que
‫tengamos que hacer nada.
‫Ahora, en Node. js, no es
‫una buena práctica confiar ciegamente en estos dos controladores de errores
‫que acabamos de implementar aquí, ¿de acuerdo?
‫Por lo tanto, lo ideal es que los errores
‫se manejen justo donde ocurren.
‫Entonces, por ejemplo, en el problema de conexión a la base de datos, por
‫supuesto, deberíamos agregar un controlador de captura allí y
‫no simplemente confiar en la
‫devolución de llamada de rechazo no controlada que tenemos aquí, ¿de acuerdo?
‫Y algunas personas incluso dicen que no deberíamos usarlos en absoluto, pero no estoy
‫de acuerdo con eso.
‫Creo que como red de seguridad, digamos,
‫pueden ser muy útiles y formar parte de nuestra aplicación.
‫Ahora, en realidad, este controlador
‫aquí debería estar en la parte superior de nuestro código, ¿de acuerdo?
‫O al menos antes de que se ejecute realmente cualquier otro código.
‫Porque mire lo que sucede si muevo esta línea de código aquí
‫antes de este controlador.
‫Entonces, si lo pongo aquí, por
‫ejemplo, y luego lo
‫guardo, entonces verá
‫que nuestro controlador no detecta esta excepción, entonces este error aquí, ¿verdad?
‫Y eso es porque solo aquí,
‫al final, realmente comenzamos a escuchar una excepción no detectada.
‫Pero en este caso, la excepción no
‫detectada ocurre incluso antes de que escuchemos ese evento.
‫Entonces, por lo tanto, no tenemos forma de atraparlo, ¿verdad?
‫Entonces, idealmente deberíamos ponerlo aquí, justo en la parte superior, nuevamente antes de
‫que se ejecute cualquier otro código.
‫Especialmente el de nuestra aplicación.
‫Así que pongámoslo aquí.
‫Ahora el problema aquí
‫será que el servidor no está definido en este punto.
‫Pero eso no
‫es un problema, porque en realidad no
‫necesitamos el servidor aquí, ¿de acuerdo?
‫Y eso se debe a
‫que estos errores, por lo que estas
‫excepciones no detectadas, no van a suceder de forma asincrónica.
‫Entonces, en realidad, no van a
‫tener nada que ver con el servidor.
‫Entonces no necesitamos esto aquí en absoluto.
‫Podemos simplemente guardarlo aquí,
‫y ahora lo tenemos antes de que realmente necesitemos
‫nuestra aplicación principal.
‫Entonces, si ahora tenemos un
‫error, intentémoslo primero aquí, para
‫que veas que
‫ahora volvemos a detectarlo en nuestro controlador de errores.
‫Pero si ahora tuviéramos este código, por ejemplo dentro de app. js, digamos, realmente no importa,
‫digamos que está aquí, y si ahora ejecutamos
‫esto, entonces
‫verá que todavía estamos detectando esa
‫excepción en nuestro controlador de
‫errores, lo que antes no sería el caso.
‫¿Está bien?
‫Y ahora solo para
‫un experimento, ¿qué piensas si ponemos este código
‫aquí en esta función de middleware?
‫¿Qué crees que sucederá
‫cuando guardemos este archivo ahora?
‫Entonces x todavía no está definido en ninguna parte, pero
‫echemos un vistazo a lo que
‫sucede cuando ejecutamos este código.
‫Y ahora, en realidad, no tenemos ningún error.
‫O en realidad lo hacemos,
‫pero eso se debe solo a nuestro rechazo no controlado,
‫que se debe al hecho de
‫que nuestra contraseña aquí todavía es incorrecta.
‫Entonces, si lo guardamos y ahora lo volvemos a
‫guardar, no debería ver ningún error.
‫Y de hecho, no lo hacemos.
‫¿Y por qué es eso?
‫Bueno, es porque esta función de middleware aquí, por
‫supuesto, solo se llama
‫tan pronto como realmente hay una solicitud, ¿verdad?
‫Entonces, veamos qué sucede cuando hacemos una solicitud.
‫Entonces, hagamos una solicitud para obtener todos los recorridos.
‫Y esperemos.
‫Y aquí aparece el mensaje "¡Algo salió muy mal! "mensaje de error
‫con el 500, y eso también se
‫debe a que todavía estamos
‫en modo de producción, ¿de acuerdo?
‫Pero de todos modos, recibir este mensaje aquí, recuerde,
‫significa que tenemos un error no operativo aquí.
‫Básicamente, un error que no creamos nosotros mismos.
‫Y entonces, justo aquí, ahora
‫ingresamos aquí en nuestro errorController, vamos aquí, ¿verdad?
‫Entonces, en esta otra rama aquí en la función sendErrorProd.
‫Y de hecho, también
‫ves el error aquí en la consola, ¿de acuerdo?
‫Y eso es lo que sucede
‫cuando hay un error dentro de cualquier middleware Express, ¿verdad?
‫Entonces Express, cuando hay un error,
‫automáticamente irá al middleware de manejo de errores con
‫ese error, ¿de acuerdo?
‫Y es por eso
‫que cuando recibimos un error aquí en
‫cualquiera de nuestras funciones de middleware, irá inmediatamente aquí en este controlador, ¿de acuerdo?
‫Y como
‫estamos en producción, ingresará a este
‫bloque aquí, pero como no es
‫un CastError, ni este error, ni un
‫ValidationError, tan pronto como se envíe el error,
‫aquí mismo, ingresaremos a este bloque. .
‫Y nuevamente, es por eso que enviamos este error genérico, ¿de acuerdo?
‫Ahora salgamos de este modo aquí
‫y volvamos a nuestro inicio normal de npm.
‫Y ahora mismo, nuestro error se enviará así, ¿verdad?
‫Entonces enviar error de desarrollo nos dará todos los detalles
‫sobre el error que está ocurriendo.
‫Y ahora, de hecho, obtenemos ReferenceError: x no está definido.
‫¿Okey?
‫Así que en la aplicación. js, línea 21.
‫Y entonces, la línea 21 es donde está,
‫pero eliminémosla.
‫Solo quería mostrártelo.
‫¿Okey?
‫De todos modos, con esto, cerramos nuestra
‫sección de manejo de errores.
‫Y podría haber un curso completo sobre manejo de
‫errores con Node y Express, porque realmente es
‫un tema increíblemente complejo.
‫Pero, en esta sección, aprenderá lo esencial
‫que necesita saber para comenzar realmente
‫a crear aplicaciones asombrosas.