2010-07-17 21 views
9

क्या बजाय nulls पर भरोसा करने की जावास्क्रिप्ट में त्रुटियों की रिपोर्ट करने के लिए एक अच्छा तरीका हो सकता है इंगित करने के लिए तकनीक, और undefineds जब त्रुटियां होती हैं और एक समारोह आगे आगे बढ़ने में असमर्थ है। मैं तीन तरीकों के बारे में सोच सकते हैं:जावास्क्रिप्ट विरोधी चुप विफलता

  1. कुछ भी नहीं
  2. कर एक अपवाद
  3. ज़ोर फेंक

यहाँ एक सरल उदाहरण परिदृश्य है - एक समारोह है कि राशि में पारित कर दिया साथ एक उपयोगकर्ता खाते श्रेय देते हैं। समारोह credit एक Account वस्तु का हिस्सा है।

यहाँ अनुभवहीन समाधान है।

function credit(amount) { 
    this.balance += amount; 
} 

इस दृष्टिकोण के साथ एक बड़ी समस्या अमान्य डेटा है। आइए इसे ठीक करें, और यह इंगित करने के लिए रिटर्न वैल्यू का उपयोग करें कि ऑपरेशन विफल हुआ।

function credit(amount) { 
    if(!isInt(amount)) { 
     return false; 
    } 
    this.balance += amount; 
} 

यह पिछले एक के ऊपर एक सुधार है, लेकिन ग्राहक कोड वापसी मान की जाँच करने के लिए सुनिश्चित करें कि आपरेशन सफल रहा होगा। मूल रूप से सिस्टम में हर विधि के लिए यह बोझिल हो सकता है।

if(!johnDoe.credit(100)) { 
    // do some error handling here 
} 

दूसरा तीसरा दृष्टिकोण, एक अपवाद फेंकना है। चूंकि हम खुद को अपवाद फेंक रहे हैं, इसलिए सामान्य के बजाए एक विशिष्ट प्रकार का अपवाद फेंक सकता है।

function credit(amount) { 
    if(!isInt(amount)) { 
     throw new InvalidAmountError(amount); 
    } 
    this.balance += amount; 
} 

फेंकने के अपवादों के समान चौथा दृष्टिकोण आपके कोड में दावे का उपयोग करना है। उपर्युक्त दृष्टिकोण की तुलना में एक कमी यह है कि चूंकि जोर सामान्य है, इसलिए हम कस्टम अपवादों को फेंकने की क्षमता खो देते हैं। यह अभी भी संभव है हालांकि प्रत्येक आवेदक कॉल में फेंकने के लिए वस्तु को पारित करना।

function credit(amount) { 
    assert(!isInt(amount), "Amount to credit is not an integer"); 
    this.balance += amount; 
} 

एक वैश्विक assert समारोह लिखने के लिए आसान है और कोड में थोड़ा छोटा बनाता है।

function assert(value, message) { 
    if(value !== true) { 
     throw new AssertionError(message); 
    } 
} 

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

AssertionError.prototype.toString = function() { 
    return 'AssertionError: ' + this.message; 
} 
इन तरीकों, क्या अनपेक्षित मान और दुखी रास्तों से निपटने के लिए एक अच्छा तरीका हो सकता है में से

। क्या यहां कोई अन्य दृष्टिकोण नहीं बताया गया है जो उपयोगी हो सकता है?

function assert(value,message,Exctype) { 
    if(value !== true) throw new Exctype(message); 
} 

कंस्ट्रक्टर्स हैं: ऊपर दृष्टिकोण की तुलना में

+2

'चेतावनी()' विरोधी चुप है :) –

+0

यह गतिशील रूप से टाइप की गई भाषाओं के सबसे कष्टप्रद पहलुओं में से एक है। – ChaosPandion

+0

@meder - haha, 'alert' उन सभी में से सबसे ज़्यादा है :) – Anurag

उत्तर

2

एक क्लाइंट-साइड लॉगिंग ढांचा इस तरह के Log4js के रूप में, त्रुटियों की रिपोर्ट पर विचार करें। एप्लिकेशन पर निर्भर करता है कि ब्राउज़र में संदेश लॉग इन कर सकते हैं (यानी, जानकारी, डीबग, चेतावनी, त्रुटि) या अजाक्स के माध्यम से सर्वर पर संदेश जारी रखें।

लॉग 4js साइट list of other JavaScript logging frameworks भी प्रदान करती है।

आपके कस्टम अपवाद उदाहरण का उपयोग करके एक अच्छा दृष्टिकोण, अपवाद फेंकना और त्रुटि को लॉग इन करने के रूप में लॉग करना होगा।

2

एक कमी है कि के बाद से ज़ोर सामान्य है, हम कस्टम अपवाद

जरूरी नहीं फेंक करने की क्षमता खो है कार्य करता है। कार्य प्रथम श्रेणी मान हैं। चारों ओर पास करने के लिए स्वतंत्र महसूस करें।