2011-11-26 4 views
7
var api_friends_helper = require('./helper.js'); 
try{ 
    api_friends_helper.do_stuff(function(result){ 
     console.log('success'); 
    }; 
}catch(err){ 
    console.log('caught error'); //this doesn't hit! 
} 

Y dentro do_stuff, que tienen:¿Cómo es que node.js no detecta mis errores?

function do_stuff(){ 
    //If I put the throw here, it will catch it! 
    insert_data('abc',function(){ 
     throw new Error('haha'); 
    }); 
} 

¿Cómo es que nunca Registros 'error atrapado'? En su lugar, se imprime la pila-trace y el objeto de error a la pantalla:

{ stack: [Getter/Setter], 
    arguments: undefined, 
    type: undefined, 
    message: 'haha' } 
Error: haha 
    at /home/abc/kj/src/api/friends/helper.js:18:23 
    at /home/abc/kj/src/api/friends/db.js:44:13 
    at Query.<anonymous> (/home/abc/kj/src/node_modules/mysql/lib/client.js:108:11) 
    at Query.emit (events.js:61:17) 
    at Query._handlePacket (/home/abc/kj/src/node_modules/mysql/lib/query.js:51:14) 
    at Client._handlePacket (/home/abc/kj/src/node_modules/mysql/lib/client.js:312:14) 
    at Parser.<anonymous> (native) 
    at Parser.emit (events.js:64:17) 
    at /home/abc/kj/src/node_modules/mysql/lib/parser.js:71:14 
    at Parser.write (/home/abc/kj/src/node_modules/mysql/lib/parser.js:576:7) 

Tenga en cuenta que si pongo el DERECHO golpe franco después de la do_stuff(), entonces será atraparlo.

¿Cómo puedo hacer que atrape, incluso si lo coloco anidado dentro de otra función?

+1

¿Cuál es 'insert_data ('abc') {throw new Error ('jaja')}' supone que es? Esa no es una sintaxis válida. ¿Cómo se ve realmente tu código? – RightSaidFred

+0

@RightSaidFred gracias, corregido. – TIMEX

+0

@TIMEX no puede detectar errores de entornos asincrónicos, no funciona de esa manera. Deje de usar 'try catch' – Raynos

Respuesta

6

Este es uno de los inconvenientes de utilizar NodeJS. Básicamente tiene dos métodos en los que se manejan los errores; Uno mediante el uso de los bloques try/catch, y otro al pasar el primer argumento de cada función de devolución de llamada como un error.

El problema se debe al modelo asincrónico de bucle de eventos. Puede usar el evento 'uncaughtException' para detectar errores que no fueron detectados, pero se ha convertido en un paradigma de programa habitual en Node.JS para usar el primer argumento de la función de devolución de llamada para mostrar si hay algún error, como tal: (I nunca se utiliza MySQL con NodeJS antes, sólo hacer un ejemplo general)

function getUser(username, callback){ 
    mysql.select("SELECT username from ...", function(err,result){ 
     if(err != null){ 
      callback(err); 
      return; 
     } 

     callback(null, result[0]); 
    }); 
}  

getUser("MyUser", function(err, user){ 
    if(err != null) 
     console.log("Got error! ", err); 
    else 
     console.log("Got user!"); 
}); 
+0

No es una de las desventajas de usar node.js. Es una de las ventajas, tienes que matar la captura de prueba y usar las devoluciones de llamadas '(err, data)' – Raynos

+0

@Raynos No entiendo por qué eso es algo bueno? try catch es una expresión consise para manejar circunstancias imprevistas ... tener un parámetro que va a ser nulo la mayoría de las veces parece intrincado y como un olor de diseño! –

+3

@DanielUpton try catch es feo, es lento como el demonio, no funciona de manera asíncrona y bloquea completamente tu aplicación – Raynos

Cuestiones relacionadas