Swift में त्रुटि प्रबंधन: try/catch और भी बहुत कुछ — पूर्ण गाइड
\n\nत्रुटि प्रबंधन iOS और macOS डेवलपमेंट में प्रमुख विषयों में से एक है। Swift भाषा में एक शक्तिशाली और सुरुचिपूर्ण त्रुटि प्रबंधन प्रणाली लागू की गई है, जो साधारण try/catch से कहीं आगे जाती है। इन तंत्रों को समझना आपको विश्वसनीय, पूर्वानुमानित और सुरक्षित कोड लिखने में सक्षम बनाता है। इस लेख में, हम सभी पहलुओं को कवर करेंगे: त्रुटियों की बुनियादी घोषणा से लेकर वैकल्पिक मानों और डीइनिशियलाइज़र के साथ उन्नत तकनीकों तक।
\n\nमूल बातें: Error प्रोटोकॉल और throws कीवर्ड
\n\nSwift में, किसी भी त्रुटि को Error प्रोटोकॉल का पालन करना चाहिए। आमतौर पर इसके लिए एनुम (enum) का उपयोग किया जाता है। आइए एक सरल उदाहरण देखें — पासवर्ड सत्यापन:
enum PasswordError: Error {\n case tooShort\n case missingDigit\n case missingUppercase\n}\n\nfunc validatePassword(_ password: String) throws {\n guard password.count >= 8 else {\n throw PasswordError.tooShort\n }\n guard password.rangeOfCharacter(from: .decimalDigits) != nil else {\n throw PasswordError.missingDigit\n }\n guard password.rangeOfCharacter(from: .uppercaseLetters) != nil else {\n throw PasswordError.missingUppercase\n }\n print("पासवर्ड सही है")\n}\n\nफ़ंक्शन घोषणा में throws कीवर्ड कंपाइलर को सूचित करता है कि निष्पादन त्रुटि से बाधित हो सकता है। ऐसे फ़ंक्शन को कॉल करने के लिए विशेष सिंटैक्स की आवश्यकता होती है।
do-catch संरचना और try कीवर्ड
\n\nसंभावित त्रुटियों को संभालने के लिए कॉल से पहले try चिह्न के साथ do-catch ब्लॉक का उपयोग किया जाता है:
do {\n try validatePassword("Hello123")\n print("सफलता!")\n} catch PasswordError.tooShort {\n print("त्रुटि: पासवर्ड बहुत छोटा है")\n} catch PasswordError.missingDigit {\n print("त्रुटि: पासवर्ड में कोई अंक नहीं है")\n} catch PasswordError.missingUppercase {\n print("त्रुटि: पासवर्ड में कोई बड़ा अक्षर नहीं है")\n} catch {\n print("अज्ञात त्रुटि: \\(error)")\n}\n\nअंतिम catch ब्लॉक पर ध्यान दें — यह पहले से न संभाली गई किसी भी त्रुटि को पकड़ता है। यह एक अनिवार्य आवश्यकता है: Swift कंपाइलर जाँचता है कि सभी संभावित त्रुटियाँ संभाली गई हैं।
try? और try! — हैंडलिंग के सरलीकृत संस्करण
\n\nकभी-कभी आपको त्रुटियों पर पूर्ण नियंत्रण की आवश्यकता नहीं होती है। Swift दो संक्षिप्त संस्करण प्रदान करता है:
\n\n- \n
- try? — त्रुटि को वैकल्पिक मान
nilमें बदल देता है। यदि कोई त्रुटि नहीं है, तो परिणामOptionalमें लपेटकर लौटाता है। \n - try! — दावा करता है कि कोई त्रुटि नहीं होगी। यदि फिर भी त्रुटि होती है, तो एप्लिकेशन क्रैश हो जाता है (runtime crash)। \n
// try? — त्रुटि को सुरक्षित रूप से अनदेखा करना\nif let _ = try? validatePassword("weak") {\n print("पासवर्ड सत्यापन पास कर गया")\n} else {\n print("पासवर्ड पास नहीं हुआ")\n}\n\n// try! — केवल तभी जब आप 100% आश्वस्त हों\nlet result = try! validatePassword("StrongPass1") // यदि पासवर्ड अमान्य है तो क्रैश\n\ntry! का उपयोग केवल उन स्थितियों में करें जहाँ त्रुटि सैद्धांतिक रूप से असंभव हो (जैसे, ऐप बंडल में एम्बेडेड संसाधन लोड करते समय)।
उन्नत तकनीकें: rethrows, defer और Result
\n\nत्रुटियों का पुनः फेंकना (rethrows)
\n\nrethrows कीवर्ड उच्च-क्रम फ़ंक्शन पर लागू होता है जो एक क्लोजर स्वीकार करते हैं जो त्रुटि फेंक सकता है। फ़ंक्शन स्वयं त्रुटि नहीं फेंकता, बल्कि इसे क्लोजर से आगे भेजता है:
func processItems(_ items: [String], using validator: (String) throws -> Void) rethrows {\n for item in items {\n try validator(item)\n }\n}\n\n// उपयोग\ndo {\n try processItems(["Hello", "World123"], using: validatePassword)\n} catch {\n print("प्रसंस्करण त्रुटि: \\(error)")\n}\n\nयह त्रुटि प्रबंधन कोड के दोहराव के बिना लचीले रैपर फ़ंक्शन लिखने की अनुमति देता है।
\n\n