2012-05-30 29 views
7

असल में, यह अपवाद क्यों नहीं पकड़ा गया है?एसिंक्रोनस जावास्क्रिप्ट में फेंकने वाले अपवाद

var http = require('http'), 
    options = { 
     host: 'www.crash-boom-bang-please.com', 
     port: 80, 
     method: 'GET' 
    }; 

try { 
    var req = http.request(options, function(res) { 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) { 
     console.log('BODY: ' + chunk); 
    }); 
    }); 

    req.on('error', function(e) { 
    throw new Error("Oh noes"); 
    }); 
    req.end(); 
} catch(_error) { 
    console.log("Caught the error"); 
} 

कुछ लोगों का सुझाव है कि इन त्रुटियों को घटना उत्सर्जक या कॉलबैक (गलती) के साथ संभाला जाना करने की जरूरत है

क्या सबसे अच्छा है (गलती से कॉलबैक होने, डेटा हस्ताक्षर नहीं कुछ मैं करने के लिए इस्तेमाल कर रहा हूँ है) इसके बारे में जाने का रास्ता?

उत्तर

8

जब आप त्रुटि फेंक रहे हैं try {} ब्लॉक लंबे समय से छोड़ा गया है, क्योंकि कॉलबैक को प्रयास/पकड़ के बाहर असीमित रूप से बुलाया जाता है। तो आप इसे पकड़ नहीं सकते हैं।

त्रुटि कॉलबैक फ़ंक्शन के अंदर किसी त्रुटि के मामले में जो भी करना चाहते हैं, वह करें।

5

नोड संस्करण 0.8 के रूप में आप domains पर अपवादों को बाधित कर सकते हैं। आप किसी निश्चित डोमेन पर अपवादों को रोक सकते हैं और उन्हें उस क्षेत्र में पकड़ सकते हैं

यदि आप रुचि रखते हैं, तो मैंने एक छोटा सा फ़ंक्शन लिखा है जो यहां एसिंक्रोनस अपवादों को पकड़ता है: Javascript Asynchronous Exception Handling with node.js। मैं कुछ प्रतिक्रिया खुशी होगी यह आप निम्नलिखित प्रदर्शन करने देगा:

var http = require('http'), 
    options = { 
     host: 'www.crash-boom-bang-please.com', 
     port: 80, 
     method: 'GET' 
    }; 

atry(function(){ 
    var req = http.request(options, function(res) { 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) { 
     console.log('BODY: ' + chunk); 
    }); 
    }); 

    req.on('error', function(e) { 
    throw new Error("Oh noes"); 
    }); 
    req.end(); 
}).catch(function(_error) { 
    console.log("Caught the error"); 
}); 
+0

वाह, यह वाकई अच्छा है! मैं इसे साझा कर रहा हूँ। – changelog

0

जावास्क्रिप्ट सिर्फ समारोह गुंजाइश नहीं है, कोशिश-पकड़ भी ब्लॉक scoped है। यह कारण है।

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