Do-Catch: এটি কী, Swift-এ নির্মাণ এবং ত্রুটি পরিচালনা

লেখক: IT Sectr প্রকাশিত: 2026-05-26 পড়ার সময়: 8 মিনিট

Do-Catch হল Swift ভাষায় ত্রুটি পরিচালনার জন্য একটি নির্মাণ যা throw-এর মাধ্যমে নিক্ষিপ্ত ব্যতিক্রমগুলি ধরে এবং সংশ্লিষ্ট কোড ব্লক executes করে। অন্যান্য ভাষায় ঐতিহ্যবাহী 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 ব্লক নিয়ে গঠিত, যার ভিতরে ত্রুটি নিক্ষেপ করতে সক্ষম কোড executes হয়, এবং এক বা একাধিক 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 executes হয়, বাকিগুলি এড়িয়ে যায়।

প্রকার অনুযায়ী মিলান

প্রতিটি catch ব্লকে একটি নির্দিষ্ট ত্রুটি প্রকারের সাথে মিলে যাওয়া প্যাটার্ন থাকতে পারে। Swift ক্রমানুযায়ী ব্লকগুলি পরীক্ষা করে, তাই আরও নির্দিষ্ট প্রকারগুলি সাধারণের আগে আসা উচিত। যদি কোনো প্যাটার্ন মেলে না, প্যাটার্ন ছাড়া catch ব্লকটি executes হয়।

একাধিক প্রকার পরিচালনা

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 ত্রুটিগুলি পরিচালনা করে, ব্যতিক্রম নয়, যা এটিকে পূর্বাভাসযোগ্য এবং কার্যকরী করে তোলে।

লাইব্রেরি এবং 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! — বাধ্যতামূলক executes

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: ব্যবহারিক উদাহরণ

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 ক্লোজার থেকে ত্রুটি প্রচার করতে দেয়। 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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন