2011-11-26 16 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! 
} 

E dentro do_stuff, ho:Come mai node.js non cattura i miei errori?

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

Come mai non si è mai log 'errore catturato'? Invece, esso stampa lo stack-trace e l'oggetto di errore per schermo:

{ 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) 

Si noti che se metto DESTRA DOPO lancio del do_stuff(), allora sarà prenderlo.

Come posso farlo catturare, anche se lo inserisco all'interno di un'altra funzione?

+1

Qual è 'insert_data ('abc') {throw new Errore ('haha')}' dovrebbe essere? Questa non è una sintassi valida. Come è il tuo codice? – RightSaidFred

+0

@RightSaidFred grazie, risolto. – TIMEX

+0

@TIMEX non è possibile rilevare errori di ambienti asincroni, non funziona in questo modo. Smetti di usare 'try catch' – Raynos

risposta

6

Questo è uno dei lati negativi dell'utilizzo di NodeJS. Fondamentalmente ha due metodi su cui vengono gestiti gli errori; Uno attraverso l'utilizzo dei blocchi try/catch e l'altro passando il primo argomento di ogni funzione di callback come errore.

Il problema è dovuto al modello asincrono del ciclo di eventi. È possibile utilizzare l'evento "uncaughtException" per rilevare errori non rilevati, ma è diventato un normale paradigma di programma in Node.JS per utilizzare il primo argomento della funzione di callback per mostrare se ci sono errori, in quanto tali: (I mai usato MySQL con NodeJS prima, solo facendo un esempio generale)

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

Non è uno dei lati negativi dell'utilizzo di node.js. È uno dei vantaggi, si arriva a uccidere try catch e usare '(err, data)' callbacks – Raynos

+0

@Raynos Non capisco perché è una buona cosa? provare a catturare è un modo consimile per gestire circostanze impreviste ... avere un parametro che sarà nullo per la maggior parte del tempo sembra contorto e come un odore di design! –

+3

@DanielUpton try catch è brutto, è lento come l'inferno, non funziona in modo asincrono e arresta completamente l'applicazione – Raynos

Problemi correlati