Do-Catch: यह क्या है, Swift में निर्माण और त्रुटि प्रबंधन

लेखक: IT Sectr प्रकाशित: 2026-05-26 पढ़ने का समय: 8 मिनट

Do-Catch Swift भाषा में त्रुटि प्रबंधन के लिए एक निर्माण है जो throw के माध्यम से फेंके गए अपवादों को पकड़ता है और संबंधित कोड ब्लॉक को निष्पादित करता है। अन्य भाषाओं में पारंपरिक try-catch के विपरीत, Swift को उन फ़ंक्शनों के स्पष्ट चिह्नांकन की आवश्यकता होती है जो throws संशोधक के साथ त्रुटि फेंक सकते हैं। Swift.org, 2026 के अनुसार, Do-Catch Swift में त्रुटि प्रबंधन की प्राथमिक तंत्र है, जो प्रकार सुरक्षा प्रदान करता है।

मुख्य बिंदु

  • Do-Catch एक Swift निर्माण है जो try और throw वाले ब्लॉक से त्रुटियों को पकड़ता है।
  • throws एक फ़ंक्शन मार्कर है जो दर्शाता है कि यह त्रुटि फेंक सकता है।
  • try do-ब्लॉक के अंदर throwing-फ़ंक्शन को कॉल करने के लिए कीवर्ड है।
  • catch प्रकार के अनुसार पैटर्न मिलान के साथ त्रुटि प्रबंधन ब्लॉक है।
  • try? और try! वैकल्पिक रूप हैं जो त्रुटियों को nil में बदलते हैं या क्रैश का कारण बनते हैं।

Do-Catch क्या है?

Do-Catch Swift में एक निर्माण है जिसमें एक do ब्लॉक होता है, जिसके अंदर त्रुटि फेंकने में सक्षम कोड निष्पादित होता है, और एक या अधिक catch ब्लॉक होते हैं जो उस त्रुटि को संभालते हैं। do ब्लॉक में try से चिह्नित throwing-फ़ंक्शनों के कॉल होते हैं, और catch ब्लॉक प्रकार के अनुसार त्रुटि का मिलान करते हैं।

Swift संरचित त्रुटि प्रबंधन का एक मॉडल लागू करता है, जो Objective-C में अपवादों से अलग है। यहाँ त्रुटि स्टैक अनवाइंडिंग वाला अपवाद नहीं है, बल्कि Error प्रोटोकॉल के अनुरूप एक मान है। throw के माध्यम से त्रुटि फेंकना स्टैक अनवाइंडिंग के ओवरहेड के बिना निकटतम catch ब्लॉक को नियंत्रण स्थानांतरित करता है।

Swift की एक प्रमुख विशेषता स्पष्ट प्रबंधन है। कंपाइलर try, do-catch या वैकल्पिक तंत्र (try?, try!) के बिना throwing-फ़ंक्शन को कॉल करने की अनुमति नहीं देता है। यह उन स्थितियों को समाप्त करता है जहाँ त्रुटि पर किसी का ध्यान नहीं जाता।

Swift में त्रुटि मॉडल: Error प्रोटोकॉल और throwing फ़ंक्शन

Swift में त्रुटि प्रबंधन के केंद्र में Error प्रोटोकॉल है। कोई भी प्रकार जो इस प्रोटोकॉल के अनुरूप है, throw के माध्यम से फेंका जा सकता है। त्रुटियों को आमतौर पर Error के अनुरूप enum के रूप में परिभाषित किया जाता है।

Error प्रोटोकॉल

Error एक खाली (मार्कर) प्रोटोकॉल है। इसे विधियों के कार्यान्वयन की आवश्यकता नहीं है, केवल अनुरूपता की। Swift कंपाइलर स्थैतिक जाँच के लिए Error का उपयोग करता है: throws वाला फ़ंक्शन केवल Error के अनुरूप मान फेंक सकता है।

Throwing फ़ंक्शन

throws से चिह्नित फ़ंक्शन को try के साथ कॉल किया जाना चाहिए। यदि ऐसे फ़ंक्शन के अंदर throw होता है, तो नियंत्रण कॉल करने वाले do-catch में स्थानांतरित हो जाता है। यदि कॉल श्रृंखला में कहीं भी त्रुटि संभाली नहीं जाती है, तो यह ऊपरी स्तर पर प्रसारित हो जाती है।

swift
enum FileError: Error {
    case notFound
    case permissionDenied
    case corrupted(String)
}

func readFile(path: String) throws -> String {
    guard FileManager.default.fileExists(atPath: path) else {
        throw FileError.notFound
    }
    return try String(contentsOfFile: path)
}

Rethrows

rethrows उन फ़ंक्शनों के लिए एक संशोधक है जो पैरामीटर के रूप में एक throwing क्लोज़र स्वीकार करते हैं। यदि पास किया गया क्लोज़र त्रुटि नहीं फेंकता है, तो rethrows फ़ंक्शन को try के बिना कॉल किया जा सकता है। यह throwing और non-throwing दोनों क्लोज़रों के साथ संगत सामान्य उच्च-क्रम फ़ंक्शन लिखने की अनुमति देता है।

Do-Catch सिंटैक्स: एकाधिक catch ब्लॉक

Swift एकाधिक catch ब्लॉकों को प्रकार-आधारित त्रुटि मिलान के साथ समर्थन करता है। यह Kotlin में when या प्रकार के अनुसार switch के समान है: पहला मेल खाने वाला catch निष्पादित होता है, बाकी छोड़ दिए जाते हैं।

प्रकार के अनुसार मिलान

प्रत्येक catch ब्लॉक में एक विशिष्ट त्रुटि प्रकार से मेल खाने वाला पैटर्न हो सकता है। Swift ब्लॉकों को क्रम में जाँचता है, इसलिए अधिक विशिष्ट प्रकार सामान्य से पहले आने चाहिए। यदि कोई पैटर्न मेल नहीं खाता है, तो बिना पैटर्न वाला catch ब्लॉक निष्पादित होता है।

एकाधिक प्रकारों को संभालना

Do-Catch की प्रकार सुरक्षा प्रत्येक त्रुटि को अलग-अलग संभालने या अल्पविराम से अलग पैटर्न मिलान के माध्यम से एक ब्लॉक में कई प्रकारों को संयोजित करने की अनुमति देती है। यह Objective-C की विशिष्ट if-else श्रृंखलाओं को समाप्त करता है, जहाँ त्रुटि विश्लेषण रिटर्न कोड या डोमेन और कोड जाँच के साथ NSError के माध्यम से किया जाता था।

Swift अतिरिक्त शर्त के साथ मिलान के लिए catch where का भी समर्थन करता है। उदाहरण के लिए, आप त्रुटियों को विशिष्ट कोड या टेक्स्ट द्वारा फ़िल्टर कर सकते हैं: catch URLError where error.code == .notConnectedToInternet। यह सटीकता बनाए रखते हुए catch ब्लॉकों की संख्या कम करता है।

throwing फ़ंक्शनों को डीबग करने के लिए, Swift त्रुटियों और अपवादों के बीच अंतर प्रदान करता है। Swift त्रुटि एक रिटर्न मान है जिसे स्टैक अनवाइंडिंग की आवश्यकता नहीं होती है। Objective-C अपवाद (@try/@catch) runtime स्तर पर काम करते हैं और केवल घातक विफलताओं के लिए उपयोग किए जाते हैं। Do-Catch त्रुटियों को संभालता है, अपवादों को नहीं, जो इसे पूर्वानुमेय और कुशल बनाता है।

लाइब्रेरी और SDK विकसित करते समय, यह याद रखना महत्वपूर्ण है कि throwing फ़ंक्शन सार्वजनिक अनुबंध का हिस्सा हैं। त्रुटि प्रकार हस्ताक्षर में निर्दिष्ट नहीं है, इसलिए टिप्पणियों में या Result-जैसे enum के माध्यम से दस्तावेज़ित करें कि फ़ंक्शन कौन सी त्रुटियाँ फेंक सकता है। यह API उपयोगकर्ताओं को कार्यान्वयन में देखे बिना सही catch ब्लॉक लिखने में मदद करता है।

अतुल्यकालिक प्रोग्रामिंग के संदर्भ में, Do-Catch async/await के साथ callback hell समस्या को हल करता है। पहले Swift में, अतुल्यकालिक कोड में त्रुटि प्रबंधन के लिए completion handlers में Error? जाँच के साथ नेस्टेड क्लोज़र की आवश्यकता होती थी। async/await और Do-Catch के साथ, अतुल्यकालिक throwing कोड तुल्यकालिक कोड जैसा दिखता है, जो प्रत्येक चरण में त्रुटि प्रबंधन के साथ जटिल अनुरोध श्रृंखलाओं को पढ़ने और बनाए रखने को सरल बनाता है।

swift
do {
    let content = try readFile(path: "/data/config.json")
    process(content)
} catch FileError.notFound {
    createDefaultConfig()
} catch FileError.permissionDenied {
    requestAccess()
} catch FileError.corrupted(let detail) {
    logCorruption(detail)
} catch {
    print("अज्ञात त्रुटि: \(error)")
}

Try विविधताएँ: try, try?, try! और कब उपयोग करें

Swift throwing फ़ंक्शनों को कॉल करने के तीन तरीके प्रदान करता है: try, try?, और try!। प्रत्येक विकल्प एक विशिष्ट कार्य को हल करता है और इसकी सीमाएँ हैं।

try — मानक कॉल

try का उपयोग do ब्लॉक के अंदर किया जाता है, और त्रुटि को catch में संभाला जाता है। यह throwing फ़ंक्शनों को कॉल करने का प्राथमिक तरीका है। कंपाइलर को आवश्यकता है कि try उस संदर्भ में हो जहाँ त्रुटि को पकड़ा जा सके।

try? — Optional में रूपांतरण

try? throwing फ़ंक्शन के परिणाम को Optional में बदलता है। यदि फ़ंक्शन त्रुटि फेंकता है, तो try? nil लौटाता है, अन्यथा सफल मान के साथ Optional लौटाता है। उन कॉलों के लिए उपयोगी जहाँ त्रुटि को अनदेखा किया जा सकता है लेकिन सफलता संकेतक की आवश्यकता है।

try! — जबरन निष्पादन

try! त्रुटि प्रबंधन को दबा देता है। यदि throwing फ़ंक्शन त्रुटि फेंकता है, तो ऐप runtime error के साथ समाप्त हो जाता है। try! का उपयोग केवल तब करें जब आपको पूरी तरह से यकीन हो कि त्रुटि असंभव है — उदाहरण के लिए, बंडल संसाधन लोड करते समय।

swift
// try? — त्रुटि को अनदेखा करते हैं, विफलता पर nil प्राप्त करते हैं
if let data = try? Data(contentsOf: url) {
    processData(data)
}

// try! — केवल यदि त्रुटि गारंटीकृत रूप से असंभव है
let bundled = try! String(contentsOfFile: "Assets/default.txt")

// try — do-catch में मानक विकल्प
do {
    let result = try performNetworkRequest()
    updateUI(result)
} catch {
    showError(error)
}

iOS डेवलपमेंट में Do-Catch: व्यावहारिक उदाहरण

Do-Catch का iOS डेवलपमेंट में सिस्टम APIs के साथ काम करने के लिए सक्रिय रूप से उपयोग किया जाता है। आइए विशिष्ट परिदृश्यों पर विचार करें: फ़ाइल सिस्टम, Core Data और नेटवर्क अनुरोधों के साथ काम करना।

फ़ाइल सिस्टम

FileManager की कई विधियाँ throwing हैं। Do-Catch फ़ाइल की अनुपस्थिति, संसाधन की व्यस्तता या अपर्याप्त अनुमतियों को ठीक से संभालने की अनुमति देता है।

Codable के साथ नेटवर्क अनुरोध

JSONDecoder के माध्यम से JSON पार्स करना एक throwing ऑपरेशन है। Do-Catch डिकोडिंग त्रुटियों और नेटवर्क विफलताओं को अलग-अलग पकड़ता है, उपयोगकर्ता को सटीक त्रुटि संदेश प्रदान करता है।

swift
struct User: Codable {
    let id: Int
    let name: String
}

func fetchUser(id: Int) async throws -> User {
    let url = URL(string: "https://api.example.com/users/\(id)")!
    let (data, _) = try await URLSession.shared.data(from: url)
    return try JSONDecoder().decode(User.self, from: data)
}

// प्रबंधन के साथ कॉल
do {
    let user = try await fetchUser(id: 42)
    showUser(user)
} catch let error as URLError {
    showNetworkAlert(error)
} catch let error as DecodingError {
    showParseError(error)
} catch {
    showGenericError(error)
}

Do-Catch के साथ सामान्य गलतियाँ

डेवलपर, विशेष रूप से अन्य भाषाओं से आने वाले, Do-Catch का उपयोग करते समय अक्सर विशिष्ट गलतियाँ करते हैं। आइए सबसे सामान्य गलतियों पर नज़र डालें।

  • भूला हुआ try — throwing फ़ंक्शन को try के बिना कॉल करना संकलन त्रुटि का कारण बनता है। Swift अंतर्निहित रूप से त्रुटियों को अनदेखा करने की अनुमति नहीं देता है।
  • खाली catch — बिना प्रबंधन वाला catch ब्लॉक त्रुटि को छिपाता है। हमेशा त्रुटि को लॉग या संभालें, भले ही वह असंभव लगे।
  • बिना मिलान के catch — सभी त्रुटियों के लिए एक सामान्य catch प्रकार सुरक्षा के लाभों को खो देता है। एकाधिक ब्लॉकों के माध्यम से प्रकारों द्वारा प्रबंधन को अलग करें।
  • try! का अत्यधिक उपयोग — production कोड में try! अप्रत्याशित क्रैश का स्रोत है। इसका उपयोग केवल बंडल संसाधनों या परीक्षणों के लिए करें।

अक्सर पूछे जाने वाले प्रश्न

Swift में Do-Catch अन्य भाषाओं में try-catch से कैसे अलग है?

Swift में, त्रुटि Error प्रोटोकॉल के अनुरूप एक मान है, न कि स्टैक अनवाइंडिंग वाला अपवाद। Throwing फ़ंक्शनों को स्पष्ट रूप से throws से चिह्नित किया जाना चाहिए, और कंपाइलर को कॉल करते समय try की आवश्यकता होती है — यह संकलन समय पर अनियंत्रित त्रुटियों को समाप्त करता है।

क्या Do-Catch को async/await के साथ उपयोग किया जा सकता है?

हाँ, async फ़ंक्शन भी throws हो सकते हैं, और do-catch उनके साथ काम करता है। async throwing फ़ंक्शन को कॉल करने के लिए do ब्लॉक के अंदर try await की आवश्यकता होती है। अतुल्यकालिक Swift कोड में त्रुटियों को संभालने का यह मानक तरीका है।

Do-catch के बिना त्रुटि कैसे संभालें?

विकल्प हैं: try? त्रुटि को nil में बदलता है, try! त्रुटि पर क्रैश का कारण बनता है, और rethrows क्लोज़र से त्रुटि को प्रसारित करने की अनुमति देता है। Do-catch स्पष्ट प्रबंधन का प्राथमिक तरीका बना हुआ है।

क्या एक फ़ंक्शन विभिन्न प्रकार की त्रुटियाँ फेंक सकता है?

Swift फेंकी गई त्रुटियों को टाइप नहीं करता है — कोई भी throwing फ़ंक्शन Error के अनुरूप कोई भी प्रकार फेंक सकता है। विशिष्ट त्रुटि प्रकारों द्वारा catch में मिलान के माध्यम से प्रबंधन को अलग करें।

क्या मुझे सभी त्रुटियों को एक कस्टम प्रकार में लपेटना चाहिए?

हाँ, यह एक सर्वोत्तम अभ्यास है। AppError को Error के अनुरूप enum के रूप में परिभाषित करें और सिस्टम त्रुटियों को डोमेन त्रुटियों में बदलें। यह प्रबंधन को एकीकृत करता है और एप्लिकेशन परत को सिस्टम विवरण से अलग करता है।

सारांश

  • Do-Catch फ़ंक्शनों पर अनिवार्य throws चिह्नांकन और कॉल पर try के साथ त्रुटि प्रबंधन के लिए एक Swift निर्माण है।
  • Swift त्रुटियाँ Error प्रोटोकॉल के अनुरूप मान हैं, न कि स्टैक अनवाइंडिंग वाले अपवाद, जो विफलता न होने पर शून्य ओवरहेड प्रदान करता है।
  • एकाधिक catch ब्लॉक switch के समान पैटर्न मिलान के साथ विभिन्न त्रुटि प्रकारों को अलग-अलग संभालने की अनुमति देते हैं।
  • try? सरल परिदृश्यों के लिए त्रुटि को nil में बदलता है, try! क्रैश जोखिम के साथ जबरन कॉल है, जिसका उपयोग केवल गारंटीकृत सफल संचालन के लिए किया जाता है।
  • Do-Catch async/await के साथ try await का उपयोग करके अतुल्यकालिक Swift कोड में त्रुटियों को संभालने का मानक तरीका है।
  • खाली catch ब्लॉक और try! के अत्यधिक उपयोग से बचें — यह त्रुटियों को छिपाता है और production में अप्रत्याशित क्रैश की ओर ले जाता है।

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें