¿Por qué el programa sigue fallando cuando se utiliza Try and Catch para capturar excepciones?
Cuando estaba estudiando "Nodejs en términos simples" hace algún tiempo, en el Capítulo 4 - Programación asincrónica, el autor Pu Ling mencionó una vez que una de las dificultades de la programación asincrónica es el manejo de excepciones. Intente utilizar métodos asincrónicos. La operación try/catch solo puede capturar excepciones dentro del bucle de eventos actual y no podrá manejar las excepciones generadas cuando se ejecuta la devolución de llamada.
Efectivamente, durante las pruebas del proyecto, encontramos el problema de bloqueo del proceso Node.js durante dos días consecutivos. A través del registro de depuración, encontré la causa y descubrí que era el problema mencionado en el libro.
Por ejemplo,
1 //test.js
2
3 var test = indefinido
4
5 intentar{
6 var f1 = function(){
7 console.log(test.toString());
8 }
9 }
10 catch(e){
11 console.log('error..');
12 }
13
14 //asumimos que en algún lugar se llamará a f1() como una función de devolución de llamada
15 f1(); p >
La función f1 imitada aquí se pasa como una función de devolución de llamada a otras funciones, y la función de devolución de llamada se ejecuta durante la ejecución de otras funciones. Desde la superficie del código, es fácil pensar que si en la Línea 7,
1 console.log(test.toString());
Si ocurre una excepción en esta línea del código, naturalmente se pensará que será capturado por try catch y no provocará que el proceso falle. Pero, de hecho, el resultado de la ejecución es:
Error de ejecución El error de la Línea 11 no se imprime, lo que indica que el error en el programa no ha sido Try Catch.
Como programa de un solo subproceso y un solo proceso, ¡Nodejs provocará que el proceso se bloquee!
------------------------- ------------------------------------------------- -----------------------------------------------------
Por lo tanto, al hacer programación asincrónica, personalmente siento:
Debemos considerar los errores que pueden ocurrir en la función de devolución de llamada, agregar código de verificación de tipo o agregar try cach donde realmente se ejecuta la devolución de llamada. para evitar excepciones. Puede ser capturado y provocar que el proceso falle.
------------------------------ ---------- ---------------------------------------- ---------- ----------------------------------
Como en este ejemplo, se puede modificar de la siguiente manera,
p>1 if(typeof(test) != 'undefinido'){
2 console.log(test. toString());
3 }
O
1 console.log(test? test.toString(): '[undefine]');
O
1 intento{
2 f1();
3 }
4 catch(e)
5 {
6 console.log('new error..');
7 }
De esta manera, ejecutando el programa nuevamente puede evitar excepciones y evitar fallas en el proceso.
Resumen:
En Node.js, hay muchas llamadas API asincrónicas. Al ejecutar la API y pasar la función de devolución de llamada, debe prestar atención a lo que puede suceder en el. Función de devolución de llamada. Los errores, si no se detectan mediante el intento normal o se evitan de otro modo, pueden provocar que el proceso se bloquee.