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! 
} 

और do_stuff अंदर, मेरे पास है:कैसे node.js मेरी त्रुटियों को पकड़ नहीं आता है?

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

कैसे आ यह कभी नहीं लॉग के त्रुटि पकड़ लिया? इसके बजाय, यह स्क्रीन करने के लिए ढेर का पता लगाने और त्रुटि वस्तु प्रिंट:

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

सूचना है कि अगर मैं) do_stuff (के बाद फेंक सही शब्दों में कहें, तो यह इसके शिकार हो सकते।

मैं इसे कैसे पकड़ सकता हूं, भले ही मैं इसे किसी अन्य फ़ंक्शन के अंदर घोंसला दूं?

+1

क्या 'insert_data ('एबीसी') है बनाने {नई त्रुटि फेंक ('haha')}' होना चाहिए? यह वैध वाक्यविन्यास नहीं है। आपका कोड वास्तव में कैसा दिखता है? – RightSaidFred

+0

@RightSaidFred धन्यवाद, तय। – TIMEX

+0

@TIMEX आप एसिंक्रोनस वातावरण की त्रुटियों को नहीं पकड़ सकते हैं, यह इस तरह से काम नहीं करता है। 'कोशिश करें' का उपयोग करना बंद करें – Raynos

उत्तर

6

यह नोडजेएस का उपयोग करने के डाउनसाइड में से एक है। इसमें मूल रूप से दो विधियां होती हैं जिन पर त्रुटियों को संभाला जाता है; एक त्रुटि के रूप में प्रत्येक कॉलबैक फ़ंक्शन के पहले तर्क को पारित करके प्रयास/पकड़ ब्लॉक का उपयोग करके और दूसरा।

समस्या घटना-लूप एसिंक्रोनस मॉडल की वजह से है। आप पकड़े गए त्रुटियों को पकड़ने के लिए 'uncaughtException' ईवेंट का उपयोग कर सकते हैं, लेकिन यह नोड.जेएस में कॉलबैक फ़ंक्शन के पहले तर्क का उपयोग करने के लिए एक सामान्य प्रोग्राम प्रतिमान बन गया है, यह दिखाने के लिए कि क्या कोई त्रुटि है, जैसे: (I कभी नहीं NodeJS साथ MySQL इस्तेमाल किया से पहले, बस एक सामान्य उदाहरण)

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

पर 'त्रुटि' पैरामीटर का उपयोग करें यह node.js. का उपयोग करने के डाउनसाइड्स में से एक नहीं है। यह फायदे में से एक है, आप पकड़ने की कोशिश करते हैं और '(गलती, डेटा)' कॉलबैक – Raynos

+0

@ रेयोनोस का उपयोग करते हैं मुझे समझ में नहीं आता कि यह अच्छी बात क्यों है? पकड़ने की कोशिश अप्रत्याशित परिस्थितियों को संभालने के लिए एक कंसिशन मुहावरे है ... एक पैरामीटर जो कि ज्यादातर समय शून्य हो जा रहा है, एक मजबूत गंध की तरह लगता है! –

+3

@DanielUpton कोशिश पकड़ना बदसूरत है, यह नरक के रूप में धीमा है, असीमित रूप से काम नहीं करता है और आपके आवेदन को पूरी तरह दुर्घटनाग्रस्त करता है – Raynos

संबंधित मुद्दे