Do-Catch হল Swift ভাষায় ত্রুটি পরিচালনার জন্য একটি নির্মাণ যা throw-এর মাধ্যমে নিক্ষিপ্ত ব্যতিক্রমগুলি ধরে এবং সংশ্লিষ্ট কোড ব্লক executes করে। অন্যান্য ভাষায় ঐতিহ্যবাহী try-catch-এর বিপরীতে, Swift-এর ফাংশনগুলির স্পষ্ট চিহ্নিতকরণ প্রয়োজন যা throws পরিবর্তকের সাথে ত্রুটি নিক্ষেপ করতে পারে। Swift.org, 2026 অনুসারে, Do-Catch হল Swift-এ ত্রুটি পরিচালনার প্রাথমিক প্রক্রিয়া, যা টাইপ নিরাপত্তা প্রদান করে।
মূল বিষয়
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 প্রোটোকল। যে কোনো প্রকার যা এই প্রোটোকলের সাথে সামঞ্জস্যপূর্ণ, 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 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 কোড সিনক্রোনাস কোডের মতো দেখায়, যা প্রতিটি ধাপে ত্রুটি পরিচালনা সহ জটিল অনুরোধ চেইন পড়া এবং রক্ষণাবেক্ষণ সহজ করে।
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)
}
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 ক্লোজার থেকে ত্রুটি প্রচার করতে দেয়। Do-catch স্পষ্ট পরিচালনার প্রাথমিক উপায় হিসাবে রয়ে গেছে।
Swift নিক্ষিপ্ত ত্রুটিগুলি টাইপ করে না — যেকোনো throwing ফাংশন Error-এর সাথে সামঞ্জস্যপূর্ণ যেকোনো প্রকার নিক্ষেপ করতে পারে। নির্দিষ্ট ত্রুটি প্রকার দ্বারা catch-এ মিলানের মাধ্যমে পরিচালনা আলাদা করুন।
হ্যাঁ, এটি একটি সেরা অভ্যাস। Error-এর সাথে সামঞ্জস্যপূর্ণ enum হিসাবে AppError সংজ্ঞায়িত করুন এবং সিস্টেম ত্রুটিগুলিকে ডোমেন ত্রুটিতে রূপান্তর করুন। এটি পরিচালনাকে একীভূত করে এবং সিস্টেম বিবরণ থেকে অ্যাপ্লিকেশন স্তরকে আলাদা করে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন