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 closure قبول کرتے ہیں۔ اگر منتقل کردہ closure خرابی نہیں پھینکتا، تو rethrows فنکشن کو try کے بغیر کال کیا جا سکتا ہے۔ یہ throwing اور non-throwing دونوں closures کے ساتھ ہم آہنگ عام اعلیٰ ترتیب کے فنکشنز لکھنے کی اجازت دیتا ہے۔
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) رن ٹائم سطح پر کام کرتی ہیں اور صرف مہلک ناکامیوں کے لیے استعمال ہوتی ہیں۔ Do-Catch مستثنیات نہیں بلکہ خرابیوں کو سنبھالتا ہے، جو اسے پیش قیاسی اور کارآمد بناتا ہے۔
لائبریریاں اور SDKs تیار کرتے وقت، یہ یاد رکھنا ضروری ہے کہ throwing فنکشنز عوامی معاہدے کا حصہ ہیں۔ خرابی کی قسم دستخط میں متعین نہیں ہے، لہذا دستاویز کریں کہ فنکشن کون سی خرابیاں پھینک سکتا ہے تبصروں میں یا Result جیسے enum کے ذریعے۔ یہ API صارفین کو نفاذ میں دیکھے بغیر درست catch بلاکس لکھنے میں مدد کرتا ہے۔
غیر مطابقت پذیر پروگرامنگ کے تناظر میں، async/await کے ساتھ Do-Catch callback hell مسئلہ حل کرتا ہے۔ پہلے Swift میں، غیر مطابقت پذیر کوڈ میں خرابی کے انتظام کے لیے completion handlers میں Error? جانچ کے ساتھ اندرونی closures کی ضرورت تھی۔ 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 فنکشن خرابی پھینکتا ہے، تو ایپ رن ٹائم ایرر کے ساتھ ختم ہو جاتی ہے۔ 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)
}
iOS ڈیولپمنٹ میں سسٹم APIs کے ساتھ کام کرنے کے لیے Do-Catch فعال طور پر استعمال ہوتا ہے۔ آئیے عام منظرناموں پر غور کریں: فائل سسٹم، 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 closure سے خرابی پھیلانے کی اجازت دیتا ہے۔ Do-catch واضح انتظام کا بنیادی طریقہ ہے۔
Swift پھینکی گئی خرابیوں کو ٹائپ نہیں کرتا — کوئی بھی throwing فنکشن Error کے مطابق کوئی بھی قسم پھینک سکتا ہے۔ مخصوص خرابی کی اقسام کے مطابق catch میں ملاپ کے ذریعے انتظام کو الگ کریں۔
ہاں، یہ ایک بہترین عمل ہے۔ Error کے مطابق enum کے طور پر AppError کی وضاحت کریں اور سسٹم کی خرابیوں کو ڈومین کی خرابیوں میں تبدیل کریں۔ یہ انتظام کو یکجا کرتا ہے اور ایپلیکیشن کی تہہ کو سسٹم کی تفصیلات سے الگ کرتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں