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 closure قبول کرتے ہیں۔ اگر منتقل کردہ closure خرابی نہیں پھینکتا، تو rethrows فنکشن کو try کے بغیر کال کیا جا سکتا ہے۔ یہ throwing اور non-throwing دونوں closures کے ساتھ ہم آہنگ عام اعلیٰ ترتیب کے فنکشنز لکھنے کی اجازت دیتا ہے۔

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) رن ٹائم سطح پر کام کرتی ہیں اور صرف مہلک ناکامیوں کے لیے استعمال ہوتی ہیں۔ Do-Catch مستثنیات نہیں بلکہ خرابیوں کو سنبھالتا ہے، جو اسے پیش قیاسی اور کارآمد بناتا ہے۔

لائبریریاں اور SDKs تیار کرتے وقت، یہ یاد رکھنا ضروری ہے کہ throwing فنکشنز عوامی معاہدے کا حصہ ہیں۔ خرابی کی قسم دستخط میں متعین نہیں ہے، لہذا دستاویز کریں کہ فنکشن کون سی خرابیاں پھینک سکتا ہے تبصروں میں یا Result جیسے enum کے ذریعے۔ یہ API صارفین کو نفاذ میں دیکھے بغیر درست catch بلاکس لکھنے میں مدد کرتا ہے۔

غیر مطابقت پذیر پروگرامنگ کے تناظر میں، async/await کے ساتھ Do-Catch callback hell مسئلہ حل کرتا ہے۔ پہلے Swift میں، غیر مطابقت پذیر کوڈ میں خرابی کے انتظام کے لیے completion handlers میں Error? جانچ کے ساتھ اندرونی closures کی ضرورت تھی۔ 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 فنکشن خرابی پھینکتا ہے، تو ایپ رن ٹائم ایرر کے ساتھ ختم ہو جاتی ہے۔ 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: عملی مثالیں

iOS ڈیولپمنٹ میں سسٹم APIs کے ساتھ کام کرنے کے لیے Do-Catch فعال طور پر استعمال ہوتا ہے۔ آئیے عام منظرناموں پر غور کریں: فائل سسٹم، 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 — try کے بغیر throwing فنکشن کو کال کرنا مرتبی غلطی کا سبب بنتا ہے۔ Swift واضح طور پر خرابیوں کو نظر انداز کرنے کی اجازت نہیں دیتا۔
  • خالی catch — انتظام کے بغیر catch بلاک خرابی کو چھپاتا ہے۔ ہمیشہ خرابی کو لاگ یا سنبھالیں، چاہے وہ ناممکن لگے۔
  • ملاپ کے بغیر catch — تمام خرابیوں کے لیے ایک عمومی catch قسم کی حفاظت کے فوائد کھو دیتا ہے۔ متعدد بلاکس کے ذریعے اقسام کے مطابق انتظام کو الگ کریں۔
  • try! کا ضرورت سے زیادہ استعمال — پروڈکشن کوڈ میں 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 closure سے خرابی پھیلانے کی اجازت دیتا ہے۔ Do-catch واضح انتظام کا بنیادی طریقہ ہے۔

کیا ایک فنکشن مختلف اقسام کی خرابیاں پھینک سکتا ہے؟

Swift پھینکی گئی خرابیوں کو ٹائپ نہیں کرتا — کوئی بھی throwing فنکشن Error کے مطابق کوئی بھی قسم پھینک سکتا ہے۔ مخصوص خرابی کی اقسام کے مطابق catch میں ملاپ کے ذریعے انتظام کو الگ کریں۔

کیا میں تمام خرابیوں کو ایک حسب ضرورت قسم میں لپیٹوں؟

ہاں، یہ ایک بہترین عمل ہے۔ Error کے مطابق enum کے طور پر AppError کی وضاحت کریں اور سسٹم کی خرابیوں کو ڈومین کی خرابیوں میں تبدیل کریں۔ یہ انتظام کو یکجا کرتا ہے اور ایپلیکیشن کی تہہ کو سسٹم کی تفصیلات سے الگ کرتا ہے۔

خلاصہ

  • Do-Catch فنکشنز پر لازمی throws نشان لگانے اور کالوں پر try کے ساتھ خرابی کے انتظام کے لیے ایک Swift ساخت ہے۔
  • Swift خرابیاں Error پروٹوکول کے مطابق قدریں ہیں، اسٹیک انوائنڈنگ کے ساتھ مستثنیات نہیں، جو ناکامی نہ ہونے پر صفر اوور ہیڈ فراہم کرتی ہیں۔
  • متعدد catch بلاکس switch کی طرح پیٹرن ملاپ کے ساتھ مختلف خرابی کی اقسام کو الگ سے سنبھالنے کی اجازت دیتے ہیں۔
  • try? سادہ منظرناموں کے لیے خرابی کو nil میں تبدیل کرتا ہے، try! کریش خطرے کے ساتھ جبری کال ہے، صرف یقینی کامیاب کارروائیوں کے لیے استعمال ہوتا ہے۔
  • Do-Catch async/await کے ساتھ try await استعمال کرتے ہوئے غیر مطابقت پذیر Swift کوڈ میں خرابیوں کو سنبھالنے کا معیاری طریقہ ہے۔
  • خالی catch بلاکس اور try! کے ضرورت سے زیادہ استعمال سے بچیں — یہ خرابیوں کو چھپاتا ہے اور پروڈکشن میں غیر متوقع کریشوں کا باعث بنتا ہے۔

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں