त्रुटियाँ
त्रुटियों के बारे में बात करते हैं।
त्रुटियों के दो प्रकार हैं:
- अपेक्षित त्रुटियां
- अप्रत्याशित त्रुटियां
- एक-के-बाद एक त्रुटियां
अपेक्षित त्रुटियाँ
अपेक्षित त्रुटियां ऐसी स्थिति हैं जहां गलत काम होता है लेकिन आप जानते हैं कि यह हो सकता है, इसलिए आप इससे निपटते हैं।
ये उपयोगकर्ता इनपुट या सर्वर अनुरोध जैसी चीजें हैं। आप जानते हैं कि उपयोगकर्ता कोई गलती कर सकता है या सर्वर डाउन हो सकता है, इसलिए आप यह सुनिश्चित करने के लिए कुछ चेकिंग कोड लिखते हैं कि प्रोग्राम फिर से इनपुट मांगता है, या एक संदेश प्रदर्शित करता है, या जो भी अन्य व्यवहार उचित है।
हाथ लगने पर ये ठीक हो जाते हैं। यदि उन्हें छोड़ दिया जाता है, तो वे अप्रत्याशित त्रुटियां हो जाती हैं।
अनपेक्षित त्रुटियां
अनपेक्षित त्रुटियां (बग) वे अवस्थाएं हैं जहां गलत काम होता है क्योंकि कोड गलत है। आप जानते हैं कि वे अंततः हो जाएंगे, लेकिन यह जानने का कोई तरीका नहीं है कि उनके साथ कहां या कैसे व्यवहार करें, क्योंकि परिभाषा के अनुसार, वे अप्रत्याशित हैं।
ये वाक्य रचना और तर्क त्रुटियों जैसी चीजें हैं। आपके पास अपने कोड में एक टाइपो हो सकता है, आपने गलत मापदंडों के साथ एक फ़ंक्शन कहा हो सकता है। ये आमतौर पर पुनर्प्राप्त करने योग्य नहीं होते हैं।
try..catch
की बात करते हैं try..catch
।
जावास्क्रिप्ट में, throw
आमतौर पर इस्तेमाल नहीं किया जाता है। यदि आप कोड में उदाहरणों के लिए चारों ओर देखते हैं तो वे कुछ और दूर के बीच होने वाले हैं, और आमतौर पर की तर्ज पर संरचित होते हैं
function example(param) {
if (!Array.isArray(param) {
throw new TypeError('"param" should be an array!');
}
...
}
इस वजह से, try..catch
ब्लॉक या तो नियंत्रण प्रवाह के लिए सामान्य नहीं हैं। आमतौर पर अपेक्षित त्रुटियों से बचने के लिए कॉलिंग विधियों से पहले कुछ चेक जोड़ना बहुत आसान है।
जावास्क्रिप्ट वातावरण के रूप में अच्छी तरह से माफ कर रहे हैं, इसलिए अप्रत्याशित त्रुटियों अक्सर के रूप में अच्छी तरह से छोड़ दिया जाता है।
try..catch
असामान्य होने की जरूरत नहीं है। कुछ अच्छे उपयोग के मामले हैं, जो जावा और सी # जैसी भाषाओं में अधिक सामान्य हैं। जावा और C # में टाइप किए गए catch
निर्माणों का लाभ है , ताकि आप अपेक्षित और अप्रत्याशित त्रुटियों के बीच अंतर कर सकें:
सी # :
try
{
var example = DoSomething();
}
catch (ExpectedException e)
{
DoSomethingElse(e);
}
यह उदाहरण अन्य अप्रत्याशित अपवादों को प्रवाहित करने की अनुमति देता है और कहीं और संभाला जा सकता है (जैसे कि लॉग किया जा रहा है और कार्यक्रम को बंद कर रहा है)।
जावास्क्रिप्ट में, इस निर्माण को इसके माध्यम से दोहराया जा सकता है:
try {
let example = doSomething();
} catch (e) {
if (e instanceOf ExpectedError) {
DoSomethingElse(e);
} else {
throw e;
}
}
उतना सुरुचिपूर्ण नहीं, जो इस कारण का हिस्सा है कि यह असामान्य क्यों है।
कार्य
कार्यों के बारे में बात करते हैं।
यदि आप एकल जिम्मेदारी सिद्धांत का उपयोग करते हैं , तो प्रत्येक वर्ग और फ़ंक्शन को एक विलक्षण उद्देश्य की सेवा करनी चाहिए।
उदाहरण के लिए, authenticate()
किसी उपयोगकर्ता को प्रमाणित कर सकता है।
इस रूप में लिखा जा सकता है:
const user = authenticate();
if (user == null) {
// keep doing stuff
} else {
// handle expected error
}
वैकल्पिक रूप से इसे इस प्रकार लिखा जा सकता है:
try {
const user = authenticate();
// keep doing stuff
} catch (e) {
if (e instanceOf AuthenticationError) {
// handle expected error
} else {
throw e;
}
}
दोनों स्वीकार्य हैं।
वादे
वादों की बात करते हैं।
वादे एक अतुल्यकालिक रूप हैं try..catch
। कॉल करना new Promise
या Promise.resolve
अपना try
कोड शुरू करना । आपको कॉल करना throw
या कोड Promise.reject
भेजना catch
।
Promise.resolve(value) // try
.then(doSomething) // try
.then(doSomethingElse) // try
.catch(handleError) // catch
यदि आपके पास उपयोगकर्ता को प्रमाणित करने के लिए एक अतुल्यकालिक फ़ंक्शन है, तो आप इसे इस प्रकार लिख सकते हैं:
authenticate()
.then((user) => {
if (user == null) {
// keep doing stuff
} else {
// handle expected error
}
});
वैकल्पिक रूप से इसे इस प्रकार लिखा जा सकता है:
authenticate()
.then((user) => {
// keep doing stuff
})
.catch((e) => {
if (e instanceOf AuthenticationError) {
// handle expected error
} else {
throw e;
}
});
दोनों स्वीकार्य हैं।
घोंसला करने की क्रिया
बात करते हैं नेस्टिंग की।
try..catch
नेस्ट किया जा सकता है। आपके authenticate()
तरीके में आंतरिक रूप से एक try..catch
ब्लॉक हो सकता है जैसे:
try {
const credentials = requestCredentialsFromUser();
const user = getUserFromServer(credentials);
} catch (e) {
if (e instanceOf CredentialsError) {
// handle failure to request credentials
} else if (e instanceOf ServerError) {
// handle failure to get data from server
} else {
throw e; // no idea what happened
}
}
इसी तरह वादे भी किए जा सकते हैं। आपके async authenticate()
विधि आंतरिक रूप से वादों का उपयोग कर सकती है:
requestCredentialsFromUser()
.then(getUserFromServer)
.catch((e) => {
if (e instanceOf CredentialsError) {
// handle failure to request credentials
} else if (e instanceOf ServerError) {
// handle failure to get data from server
} else {
throw e; // no idea what happened
}
});
तो जवाब क्या है?
ठीक है, मुझे लगता है कि मेरे लिए वास्तव में इस सवाल का जवाब देने का समय है:
क्या प्रमाणीकरण में विफलता के कारण कुछ ऐसा माना जाता है जिसे आप के लिए वादा अस्वीकार कर देंगे?
सबसे सरल उत्तर जो मैं दे सकता हूं, वह यह है कि आपको कहीं भी एक वादे को अस्वीकार कर देना चाहिए अन्यथा आप throw
एक अपवाद चाहते हैं यदि यह समकालिक कोड हो।
अगर आपके बयानों if
में कुछ जाँच होने से आपका नियंत्रण प्रवाह सरल है then
, तो किसी वादे को अस्वीकार करने की आवश्यकता नहीं है।
यदि किसी वादे को अस्वीकार करने और फिर आपकी त्रुटि हैंडलिंग कोड में त्रुटियों के प्रकार की जांच करके आपका नियंत्रण प्रवाह सरल है, तो इसके बजाय ऐसा करें।
reject
गलत नहीं लौटना चाहिए , लेकिन यदि आप मान होने की उम्मीद कर रहे हैंBool
, तो आप सफल थे और आपको मूल्य की परवाह किए बिना बूल के साथ हल करना चाहिए। मूल्य मूल्यों के लिए प्रॉक्सी के प्रकार हैं - वे लौटे मूल्य को संग्रहीत करते हैं, इसलिए केवल अगर मूल्य प्राप्त नहीं किया जा सकता है तो आपको चाहिएreject
। नहीं तो आपको चाहिएresolve
।