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

A wewnątrz do_stuff, mam:Dlaczego węzeł node.js nie przechwytuje moich błędów?

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

Jak to się stało, że nigdy kłody 'złapany błąd'? Zamiast tego drukuje ślad stosu i obiekt błędu do ekranu:

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

Zauważ, że jeśli mogę umieścić PRAWO rzut PO do_stuff(), to będzie go złapać.

Jak mogę go złapać, nawet jeśli umieściłbym go w innej funkcji?

+1

Co jest 'insert_data ('abc') {throw new Error ('haha')}' ma być? To nie jest poprawna składnia. Jak wygląda twój kod? – RightSaidFred

+0

@RightSaidFred dzięki, naprawione. – TIMEX

+0

@ TIMEX nie można przechwytywać błędów asynchronicznego środowiska, to nie działa w ten sposób. Przestań używać 'try catch' – Raynos

Odpowiedz

6

Jest to jedna z wad korzystania z NodeJS. Zasadniczo ma dwie metody postępowania z błędami; Jeden za pomocą bloków try/catch i innych, przekazując pierwszy argument każdej funkcji zwrotnej jako błąd.

Problem wynika z asynchronicznego modelu pętli zdarzeń. Możesz użyć zdarzenia "uncaughtException", aby złapać błędy, które nie zostały przechwycone, ale stało się standardowym paradygmatem programu w Node.JS, aby użyć pierwszego argumentu funkcji wywołania zwrotnego, aby pokazać, czy są jakieś błędy, jako takie: (I nigdy nie używany MySQL z NodeJS wcześniej, tylko co ogólny przykład)

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

Nie jest to jedna z wad korzystania z node.js. To jedna z zalet, którą możesz zabić, spróbuj złapać i użyć zwrotów '(err, data)' – Raynos

+0

@Raynos Nie rozumiem, dlaczego to dobrze? spróbuj catch jest idiomem konsylium do obsługi nieprzewidzianych okoliczności ... mając parametr, który będzie null przez większość czasu wydaje się zawiłe i jak zapach designu! –

+3

@DanielUpton spróbuj złapać jest brzydki, jest powolny jak diabli, nie działa asynchronicznie i całkowicie zawiesza twoją aplikację – Raynos

Powiązane problemy