क्या बजाय nulls पर भरोसा करने की जावास्क्रिप्ट में त्रुटियों की रिपोर्ट करने के लिए एक अच्छा तरीका हो सकता है इंगित करने के लिए तकनीक, और undefineds जब त्रुटियां होती हैं और एक समारोह आगे आगे बढ़ने में असमर्थ है। मैं तीन तरीकों के बारे में सोच सकते हैं:जावास्क्रिप्ट विरोधी चुप विफलता
- कुछ भी नहीं
- कर एक अपवाद
- ज़ोर फेंक
यहाँ एक सरल उदाहरण परिदृश्य है - एक समारोह है कि राशि में पारित कर दिया साथ एक उपयोगकर्ता खाते श्रेय देते हैं। समारोह 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);
}
कंस्ट्रक्टर्स हैं: ऊपर दृष्टिकोण की तुलना में
'चेतावनी()' विरोधी चुप है :) –
यह गतिशील रूप से टाइप की गई भाषाओं के सबसे कष्टप्रद पहलुओं में से एक है। – ChaosPandion
@meder - haha, 'alert' उन सभी में से सबसे ज़्यादा है :) – Anurag