2012-06-11 20 views
9

मैं निम्नलिखित coffeescript कोड है:कॉफ़ीस्क्रिप्ट/जावास्क्रिप्ट 'फेंक त्रुटि' या 'नई त्रुटि (त्रुटि) फेंक दें' का प्रयोग करें?

try 
    do something 
catch error 
    log something 
    throw error 

मैं throw new Error(error) बजाय throw error उपयोग करना चाहिए?

क्या अंतर है?

उत्तर

16

की तरह सी # या जावा अन्य भाषाओं में के रूप में ही है:

  • throw error एक ही त्रुटि वस्तु
  • throw new Error(error) एक नया त्रुटि वस्तु में यह लपेटता फेंकता है। बाद में इसका उपयोग किया जाता है, उदाहरण के लिए, जावा में जब आपको checked Exception को अनचेक में परिवर्तित करने की आवश्यकता होती है। जावास्क्रिप्ट में आपको अपवादों को लपेटने की आवश्यकता नहीं है क्योंकि इससे थोड़ा सा और कम सुंदर हो जाएगा।

संपादित करें: कुछ सुरक्षा प्रभाव भी हैं।

function noWrap() { 
    try { 
     var o = {}; o.nonexistingMethod(); 
    } catch (error) { 
     throw error; 
    } 
} 

function wrap() { 
    try { 
     var o = {}; o.nonexistingMethod(); 
    } catch (error) { 
     throw new Error(error); 
    } 
} 

कॉलिंग noWrap() उत्पादन निम्न त्रुटि संदेश:

"TypeError: Object #<Object> has no method 'nonexistingMethod'" 
// with error.arguments === ['nonexistingMethod', o] 

कॉलिंग wrap() उत्पादन निम्न त्रुटि संदेश: यहाँ एक उदाहरण है

"Error: TypeError: Object #<Object> has no method 'nonexistingMethod'" 
// with error.arguments === undefined 

तो, जैसा कि आप एक का उपयोग करके देख सकते हैं रैपिंग त्रुटि ऑब्जेक्ट हम मूल त्रुटि के arguments को छुपा सकते हैं। आप निम्न में से एक लिख रहे हैं मान लीजिए:

  • एक पुस्तकालय
  • एक स्क्रिप्ट जो एक पृष्ठ पर लोड किया जाएगा कि आपकी नहीं है (किसी तरह का उदाहरण के लिए, की तरह या ट्वीट बटन किसी तरह का)
  • एक पृष्ठ पर एक स्क्रिप्ट सुरक्षित रहने के लिए कुछ तृतीय-पक्ष स्क्रिप्ट लोड (सामाजिक बटन, विज्ञापन, ट्रैकिंग कोड, आदि)

क्रम में ऊपर सूचीबद्ध से सभी मामलों में है कि आप लपेट चाहिए आपकाErrorऑब्जेक्ट। अन्यथा आप गलती से अपने आंतरिक वस्तुओं, कार्यों और चर के संदर्भों को रिसाव कर सकते हैं।

संपादित करें: स्टैकट्रैस के बारे में। दोनों प्रकार उन्हें संरक्षित करते हैं। यहाँ a working example है और मैं क्रोम में निम्नलिखित stacktraces मिलती है:

// No wrapping: 
TypeError: Object #<Object> has no method 'nonexistingMethod' 
    at noWrap (http://fiddle.jshell.net/listochkin/tJzCF/show/:22:23) 
    at http://fiddle.jshell.net/listochkin/tJzCF/show/:37:5 
    at http://fiddle.jshell.net/js/lib/mootools-core-1.4.5-nocompat.js:3901:62 
    at http://fiddle.jshell.net/js/lib/mootools-core-1.4.5-nocompat.js:3915:20 

// Wrapping: 
Error: TypeError: Object #<Object> has no method 'nonexistingMethod' 
    at wrap (http://fiddle.jshell.net/listochkin/tJzCF/show/:32:15) 
    at http://fiddle.jshell.net/listochkin/tJzCF/show/:44:5 
    at http://fiddle.jshell.net/js/lib/mootools-core-1.4.5-nocompat.js:3901:62 
    at http://fiddle.jshell.net/js/lib/mootools-core-1.4.5-nocompat.js:3915:20 
+0

मुझे किसी ने सलाह दी है कि लिपटे संस्करण आप एक पूर्ण स्टैकट्रेस के साथ एक त्रुटि वस्तु देता है, अन्यथा आप केवल त्रुटि संदेश मिलता है। –

+0

वह दावा करता है कि आपको स्टैकट्रैक मिलता है क्योंकि आप console.error() का उपयोग करते हैं, अगर आप कहीं और त्रुटि ऑब्जेक्ट को पास करना चाहते हैं, तो आप उन्हें हटा दें। मुझे विश्वास है कि वे संरक्षित हैं, लेकिन इसकी जांच करना दिलचस्प होगा। –

+1

यह ब्राउज़र-निर्भर है। उदाहरण के लिए, आईई 9 में त्रुटि ऑब्जेक्ट्स पर 'स्टैक' संपत्ति नहीं है। मैं अन्य ब्राउज़रों के बारे में नहीं जानता। –