जावास्क्रिप्ट और टाइपप्रति में त्रुटि प्रबंधन
जब भी रनटाइम पर कोई त्रुटि होती है, तो यह जावास्क्रिप्ट और टाइपस्क्रिप्ट में "फेंक दिया" जाता है, जैसा कि अधिकांश प्रोग्रामिंग भाषाओं में होता है। बिना क्रिया के फेंकी गई त्रुटियां आपके ऐप या सेवा के क्रैश का कारण बनेंगी, इस प्रकार सबसे खराब उपयोगकर्ता अनुभव संभव है। यदि कोई त्रुटि होती है, तो कोई भी सहेजी नहीं गई प्रगति खो जाती है और उपयोगकर्ता संभावित रूप से एक लंबी प्रक्रिया शुरू कर सकते हैं (उदाहरण के लिए, यदि कोई उपयोगकर्ता बहुत सारी जानकारी प्रदान करके किसी प्लेटफ़ॉर्म पर नामांकन कर रहा था) फिर से। इसका परिणाम यह होता है कि वे उपयोगकर्ता आपके उत्पाद का फिर कभी उपयोग नहीं करेंगे, क्योंकि विश्वास खो गया है।
ऐसे मामलों को संभालने के लिए, एक त्रुटि "पकड़" जा सकती है। जावास्क्रिप्ट और टाइपस्क्रिप्ट में त्रुटियों को पकड़ने के लिए, आप बस अपने कोड को "कोशिश" -ब्लॉक में लपेटते हैं, उसके बाद "कैच" -ब्लॉक।
async function getData(){
try {
// Call a dummy async 'fetch'-functoin
const result = await fetch();
return { result };
} catch(error) {
return { error };
}
}
// ... later in your code ....
const { result, error } = await getData();
if (error){
// ... handle error case.
}
// Access the results.
परिणाम यह है कि त्रुटि पूरे सिस्टम में नहीं फैलती है, जो क्रैश की ओर ले जाती है, लेकिन सीधे आपके कोड के दायरे में नियंत्रित की जाएगी। ऐप या सेवा क्रैश नहीं होगी और त्रुटि को संसाधित करने के लिए एक शमन रणनीति लागू की जा सकती है।
"आखिरकार" -ब्लॉक के साथ विशेष हैंडलिंग
त्रुटियों को संभालने के लिए एक अतिरिक्त कदम के रूप में, जावास्क्रिप्ट और टाइपस्क्रिप्ट एक अतिरिक्त "आखिरकार" -कीवर्ड प्रदान करते हैं। ऐसा "आखिरकार" -ब्लॉक "कोशिश" -ब्लॉक के साथ-साथ "कैच" -ब्लॉक दोनों के निष्पादित होने के बाद अपने दायरे में किसी भी कोड को निष्पादित करता है (यदि कोई त्रुटि हुई)।
// This function is absolutely save
// to call. It fetches some data and
// optionally catches a potential error.
//
// After everything's done, a 'finally'
// sends the error to our backend for logs,
// if there was any.
async function getData(){
// In this case, we store the result
// and error in mutable variables,
// then return both.
let result: Result;
let error: Error;
try {
// Call a dummy async 'fetch'-function
result = await fetch();
} catch(e) {
error = e;
} finally {
// After the whole try/catch has been
// processed, we can log the error.
if(error){
await trackErrorInCloud(error);
}
}
return { result, error };
}
// ... same as before ...
लेकिन रुकिए, और भी बहुत कुछ है! क्या आप जानते हैं कि "आखिरकार" -ब्लॉक निष्पादित हो जाता है, भले ही आप "कोशिश" - या "पकड़" -ब्लॉक में परिणाम वापस कर दें? यहां एक उदाहरण दिया गया है कि मेरा इससे क्या मतलब है।
// Same as the example before, but
// now we directly return from within
// each code block. And this is where
// a side effect can happen.
async function getData(){
try {
const result = await fetch();
return { result };
} catch(error) {
return { error }
} finally {
//
// WATCH OUT!
//
// Just for demo purpose, but this
// line of code will override both
// the return in 'try' as well as 'catch'!
//
// Returning inside of 'finally' is therefore
// dangerous and will lead to hard-to-debug
// issues.
return { finally: true };
}
}
// data === { finally: true }
const data = await getData();
// Here's a better use case for
// finally.
async function getData(){
let error: Error;
try {
const result = await fetch();
return { result };
} catch(e) {
error = e;
return { error }
} finally {
// No return in finally,
// so it's safe to use.
if(error){
await logInCloud()
}
}
}
// if no error === { result: ... }
// if error === { error: ... }
const data = await getData();
सारांश
जैसा कि आपने देखा, जावास्क्रिप्ट और टाइपस्क्रिप्ट में त्रुटियों को संभालना काफी आसान है और आपके एप्लिकेशन के पूर्ण क्रैश से बचा जाता है। "आखिरकार" -ब्लॉक का उपयोग करते समय "कोशिश" - और "कैच" -ब्लॉक में परिणामों को वापस करने की विशेष हैंडलिंग जानना अच्छा है, लेकिन आपके कोड को एक विरोधी पैटर्न शैली में लागू करने से बचने के लिए दुरुपयोग नहीं किया जाना चाहिए।