2012-10-25 13 views
21

डगलस Crockford कुछ इस तरह कर रही सिफारिश की गई है:जावास्क्रिप्ट में कस्टम अपवाद फेंकना। किस शैली का उपयोग करना है?

throw { 
    name: "System Error", 
    message: "Something horrible happened." 
}; 

लेकिन क्या आप भी कुछ इस तरह कर सकता है: मुझे लगता है कि आप एक शामिल हो सकते हैं

try { 
    //some code that generates exceptions 
} catch(e) {  
    if(e instanceof IllegalArgumentException) { 
     //handle this 
    } else if(e instanceof SomeOtherTypeOfException) { 
     //handle this 
    } 
} 

:

function IllegalArgumentException(message) { 
    this.message = message; 
} 

throw new IllegalArgumentException("Argument cannot be less than zero"); 

और उसके बाद करना क्रॉकफोर्ड के कार्यान्वयन में type संपत्ति और फिर instanceof करने की बजाय जांच करें। क्या एक बनाम दूसरे से कोई फायदा है?

+3

किसी के लिए जावा-शैली अपवादों के लिए उपयोग किया जाता है, दूसरा रूप बहुत अधिक दिखता है ... अधिक परिचित। – NullUserException

+1

हां, मैं इसी कारण से दूसरे के लिए आंशिक हूं। :) –

+4

मैं दूसरे के पक्ष में हूं क्योंकि यह कोड शुद्धता के मामले में अधिक पुन: प्रयोज्य है। सटीक होने के लिए, यदि मैं कई जगहों पर एक ही अपवाद प्रकार को फेंकने वाला हूं, तो मेरा कोड पहले दृष्टिकोण के साथ गन्दा (विशाल) होगा। – bellpeace

उत्तर

24

कृपया ध्यान दें कि इस बीच अधिकांश जावाScripts वातावरण Error object अपवादों के आधार के रूप में प्रदान करते हैं। यह आपको पहले से ही एक संदेश परिभाषित करने की अनुमति देता है, लेकिन अपवाद के संदर्भ को ट्रैक करने के लिए एक उपयोगी स्टैक प्रॉपर्टी भी प्रदान करता है। प्रोटोटाइपिकल विरासत का उपयोग कर आप अपना अपवाद प्रकार बना सकते हैं। पहले से ही कई स्टैक ओवरफ्लो चर्चाएं हैं (उदाहरण के लिए: here), यह ठीक से कैसे करें। हालांकि, मुझे सही और आधुनिक दृष्टिकोण मिलने तक थोड़ा सा खोदना पड़ा। कृपया ध्यान रखें कि मोज़िला दस्तावेज़ (ऊपर देखें) में सुझाए गए दृष्टिकोण को स्टैक ओवरफ्लो समुदाय द्वारा पसंद नहीं किया जाता है। बहुत सारे पढ़ने के बाद मैं त्रुटि.प्रोटोटाइप से प्राप्त होने के लिए उस दृष्टिकोण के साथ आया:

function IllegalArgumentException(sMessage) { 
    this.name = "IllegalArgumentException"; 
    this.message = sMessage; 
    this.stack = (new Error()).stack; 
} 
IllegalArgumentException.prototype = Object.create(Error.prototype); 
IllegalArgumentException.prototype.constructor = IllegalArgumentException; 
4

मैं दूसरे के पक्ष में हूं क्योंकि यह कोड शुद्धता के मामले में अधिक पुन: प्रयोज्य है। सटीक होने के लिए, यदि मैं कई स्थानों पर एक ही अपवाद (एक अलग संदेश के साथ एक ही अपवाद प्रकार) फेंकने वाला हूं, तो मेरा कोड पहले दृष्टिकोण के साथ गन्दा (विशाल) होगा।