Do-Catch Swift भाषा में त्रुटि प्रबंधन के लिए एक निर्माण है जो throw के माध्यम से फेंके गए अपवादों को पकड़ता है और संबंधित कोड ब्लॉक को निष्पादित करता है। अन्य भाषाओं में पारंपरिक try-catch के विपरीत, Swift को उन फ़ंक्शनों के स्पष्ट चिह्नांकन की आवश्यकता होती है जो throws संशोधक के साथ त्रुटि फेंक सकते हैं। Swift.org, 2026 के अनुसार, Do-Catch Swift में त्रुटि प्रबंधन की प्राथमिक तंत्र है, जो प्रकार सुरक्षा प्रदान करता है।
मुख्य बिंदु
Do-Catch Swift में एक निर्माण है जिसमें एक do ब्लॉक होता है, जिसके अंदर त्रुटि फेंकने में सक्षम कोड निष्पादित होता है, और एक या अधिक catch ब्लॉक होते हैं जो उस त्रुटि को संभालते हैं। do ब्लॉक में try से चिह्नित throwing-फ़ंक्शनों के कॉल होते हैं, और catch ब्लॉक प्रकार के अनुसार त्रुटि का मिलान करते हैं।
Swift संरचित त्रुटि प्रबंधन का एक मॉडल लागू करता है, जो Objective-C में अपवादों से अलग है। यहाँ त्रुटि स्टैक अनवाइंडिंग वाला अपवाद नहीं है, बल्कि Error प्रोटोकॉल के अनुरूप एक मान है। throw के माध्यम से त्रुटि फेंकना स्टैक अनवाइंडिंग के ओवरहेड के बिना निकटतम catch ब्लॉक को नियंत्रण स्थानांतरित करता है।
Swift की एक प्रमुख विशेषता स्पष्ट प्रबंधन है। कंपाइलर try, do-catch या वैकल्पिक तंत्र (try?, try!) के बिना throwing-फ़ंक्शन को कॉल करने की अनुमति नहीं देता है। यह उन स्थितियों को समाप्त करता है जहाँ त्रुटि पर किसी का ध्यान नहीं जाता।
Swift में त्रुटि प्रबंधन के केंद्र में Error प्रोटोकॉल है। कोई भी प्रकार जो इस प्रोटोकॉल के अनुरूप है, throw के माध्यम से फेंका जा सकता है। त्रुटियों को आमतौर पर Error के अनुरूप enum के रूप में परिभाषित किया जाता है।
Error एक खाली (मार्कर) प्रोटोकॉल है। इसे विधियों के कार्यान्वयन की आवश्यकता नहीं है, केवल अनुरूपता की। Swift कंपाइलर स्थैतिक जाँच के लिए Error का उपयोग करता है: throws वाला फ़ंक्शन केवल Error के अनुरूप मान फेंक सकता है।
throws से चिह्नित फ़ंक्शन को try के साथ कॉल किया जाना चाहिए। यदि ऐसे फ़ंक्शन के अंदर throw होता है, तो नियंत्रण कॉल करने वाले do-catch में स्थानांतरित हो जाता है। यदि कॉल श्रृंखला में कहीं भी त्रुटि संभाली नहीं जाती है, तो यह ऊपरी स्तर पर प्रसारित हो जाती है।
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 उन फ़ंक्शनों के लिए एक संशोधक है जो पैरामीटर के रूप में एक throwing क्लोज़र स्वीकार करते हैं। यदि पास किया गया क्लोज़र त्रुटि नहीं फेंकता है, तो rethrows फ़ंक्शन को try के बिना कॉल किया जा सकता है। यह throwing और non-throwing दोनों क्लोज़रों के साथ संगत सामान्य उच्च-क्रम फ़ंक्शन लिखने की अनुमति देता है।
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 कोड तुल्यकालिक कोड जैसा दिखता है, जो प्रत्येक चरण में त्रुटि प्रबंधन के साथ जटिल अनुरोध श्रृंखलाओं को पढ़ने और बनाए रखने को सरल बनाता है।
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)")
}
Swift throwing फ़ंक्शनों को कॉल करने के तीन तरीके प्रदान करता है: try, try?, और try!। प्रत्येक विकल्प एक विशिष्ट कार्य को हल करता है और इसकी सीमाएँ हैं।
try का उपयोग do ब्लॉक के अंदर किया जाता है, और त्रुटि को catch में संभाला जाता है। यह throwing फ़ंक्शनों को कॉल करने का प्राथमिक तरीका है। कंपाइलर को आवश्यकता है कि try उस संदर्भ में हो जहाँ त्रुटि को पकड़ा जा सके।
try? throwing फ़ंक्शन के परिणाम को Optional में बदलता है। यदि फ़ंक्शन त्रुटि फेंकता है, तो try? nil लौटाता है, अन्यथा सफल मान के साथ Optional लौटाता है। उन कॉलों के लिए उपयोगी जहाँ त्रुटि को अनदेखा किया जा सकता है लेकिन सफलता संकेतक की आवश्यकता है।
try! त्रुटि प्रबंधन को दबा देता है। यदि throwing फ़ंक्शन त्रुटि फेंकता है, तो ऐप runtime error के साथ समाप्त हो जाता है। try! का उपयोग केवल तब करें जब आपको पूरी तरह से यकीन हो कि त्रुटि असंभव है — उदाहरण के लिए, बंडल संसाधन लोड करते समय।
// 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)
}
Do-Catch का iOS डेवलपमेंट में सिस्टम APIs के साथ काम करने के लिए सक्रिय रूप से उपयोग किया जाता है। आइए विशिष्ट परिदृश्यों पर विचार करें: फ़ाइल सिस्टम, Core Data और नेटवर्क अनुरोधों के साथ काम करना।
FileManager की कई विधियाँ throwing हैं। Do-Catch फ़ाइल की अनुपस्थिति, संसाधन की व्यस्तता या अपर्याप्त अनुमतियों को ठीक से संभालने की अनुमति देता है।
JSONDecoder के माध्यम से JSON पार्स करना एक throwing ऑपरेशन है। Do-Catch डिकोडिंग त्रुटियों और नेटवर्क विफलताओं को अलग-अलग पकड़ता है, उपयोगकर्ता को सटीक त्रुटि संदेश प्रदान करता है।
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 का उपयोग करते समय अक्सर विशिष्ट गलतियाँ करते हैं। आइए सबसे सामान्य गलतियों पर नज़र डालें।
अक्सर पूछे जाने वाले प्रश्न
Swift में, त्रुटि Error प्रोटोकॉल के अनुरूप एक मान है, न कि स्टैक अनवाइंडिंग वाला अपवाद। Throwing फ़ंक्शनों को स्पष्ट रूप से throws से चिह्नित किया जाना चाहिए, और कंपाइलर को कॉल करते समय try की आवश्यकता होती है — यह संकलन समय पर अनियंत्रित त्रुटियों को समाप्त करता है।
हाँ, async फ़ंक्शन भी throws हो सकते हैं, और do-catch उनके साथ काम करता है। async throwing फ़ंक्शन को कॉल करने के लिए do ब्लॉक के अंदर try await की आवश्यकता होती है। अतुल्यकालिक Swift कोड में त्रुटियों को संभालने का यह मानक तरीका है।
विकल्प हैं: try? त्रुटि को nil में बदलता है, try! त्रुटि पर क्रैश का कारण बनता है, और rethrows क्लोज़र से त्रुटि को प्रसारित करने की अनुमति देता है। Do-catch स्पष्ट प्रबंधन का प्राथमिक तरीका बना हुआ है।
Swift फेंकी गई त्रुटियों को टाइप नहीं करता है — कोई भी throwing फ़ंक्शन Error के अनुरूप कोई भी प्रकार फेंक सकता है। विशिष्ट त्रुटि प्रकारों द्वारा catch में मिलान के माध्यम से प्रबंधन को अलग करें।
हाँ, यह एक सर्वोत्तम अभ्यास है। AppError को Error के अनुरूप enum के रूप में परिभाषित करें और सिस्टम त्रुटियों को डोमेन त्रुटियों में बदलें। यह प्रबंधन को एकीकृत करता है और एप्लिकेशन परत को सिस्टम विवरण से अलग करता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें