Do-Catch — Swift tilida xatolarni boshqarish konstruksiyasi bo'lib, throw orqali chiqarilgan istisnolarni tutadi va tegishli kod blokini bajaradi. Boshqa tillardagi an'anaviy try-catch-dan farqli o'laroq, Swift xato chiqarishi mumkin bo'lgan funksiyalarni throws modifikatori bilan aniq belgilashni talab qiladi. Swift.org, 2026 ma'lumotlariga ko'ra, Do-Catch Swift-da tip darajasida xavfsizlikni ta'minlovchi asosiy xatolarni boshqarish mexanizmidir.
Asosiy ma'lumotlar
Do-Catch — Swift-da do blokidan iborat konstruksiya bo'lib, uning ichida xato chiqarishi mumkin bo'lgan kod bajariladi va bir yoki bir nechta catch bloklari bu xatoni boshqaradi. Do bloki try bilan belgilangan throwing funksiyalarining chaqiruvlarini o'z ichiga oladi, catch bloklari esa xatoni turi bo'yicha moslashtiradi.
Swift Objective-C-dagi istisnolardan farq qiluvchi strukturali xatolarni boshqarish modelini qo'llaydi. Bu yerda xato stackni ochish bilan exception emas, balki Error protokoliga mos keladigan qiymatdir. Throw orqali xatoni chiqarish boshqaruvni stackni ochish xarajatisiz eng yaqin catch blokiga uzatadi.
Swift-ning asosiy xususiyati — boshqarishning aniqligi. Kompilyator throwing funksiyasini try, do-catch yoki muqobil mexanizmsiz (try?, try!) chaqirishga ruxsat bermaydi. Bu xato e'tibordan chetda qoladigan holatlarni istisno qiladi.
Swift-da xatolarni boshqarish asosida Error protokoli yotadi. Ushbu protokolga mos keladigan har qanday tip throw orqali chiqarilishi mumkin. Odatda xatolar Error tasdig'i bilan enum sifatida aniqlanadi.
Error — bo'sh protokol (marker). Metodlarni amalga oshirishni talab qilmaydi, faqat muvofiqlikni tasdiqlashni talab qiladi. Swift kompilyatori statik tekshirish uchun Error-dan foydalanadi: throws bo'lgan funksiya faqat Error-ga mos keladigan qiymatni chiqarishi mumkin.
throws bilan belgilangan funksiya try bilan chaqirilishi kerak. Agar bunday funksiya ichida throw sodir bo'lsa, boshqaruv chaqiruvchi do-catch-ga o'tadi. Agar xato chaqiruv zanjirining hech bir joyida boshqarilmasa, u yuqori darajaga uzatiladi.
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 — parametr sifatida throwing-yopilishini qabul qiluvchi funksiyalar uchun modifikator. Agar uzatilgan yopilish xato chiqarmasa, rethrows funksiyasini trysiz chaqirish mumkin. Bu throwing va non-throwing yopilishlari bilan mos keladigan umumiy yuqori darajali funksiyalarni yozishga imkon beradi.
Swift xato turi bo'yicha moslashtirish bilan bir nechta catch bloklarini qo'llab-quvvatlaydi. Bu Kotlin-dagi when yoki tur bo'yicha switch-ga o'xshaydi: birinchi mos keladigan catch bajariladi, qolganlari o'tkazib yuboriladi.
Har bir catch bloki ma'lum bir xato turi bilan moslashtirish namunasini o'z ichiga olishi mumkin. Swift bloklarni tartib bilan tekshiradi, shuning uchun aniqroq turlar umumiylardan oldin joylashishi kerak. Agar hech qanday namuna mos kelmasa, namunasiz catch bloki bajariladi.
Tip xavfsizligi Do-Catch har bir xatoni alohida boshqarish yoki pattern-matching-da vergul orqali bir blokda bir nechta turni birlashtirishga imkon beradi. Bu Objective-C ga xos bo'lgan, xato tahlili qaytarish kodi yoki domain va code tekshiruvi bilan NSError orqali amalga oshiriladigan hajmli if-else zanjirlarini yo'q qiladi.
Swift shuningdek catch where — qo'shimcha shart bilan moslashtirishni qo'llab-quvvatlaydi. Masalan, xatolarni ma'lum kod yoki matn bo'yicha filtrlash mumkin: catch URLError where error.code == .notConnectedToInternet. Bu boshqarish aniqligini saqlab, catch bloklari sonini kamaytiradi.
Throwing funksiyalarini tuzatish uchun Swift xatolar va istisnolar o'rtasidagi farqni ta'minlaydi. Swift xatosi — stackni ochishni talab qilmaydigan qaytariladigan qiymat. Objective-C istisnolari (@try/@catch) runtime darajasida ishlaydi va faqat jiddiy nosozliklar uchun ishlatiladi. Do-Catch aynan xatolarni boshqaradi, istisnolarni emas, bu uni bashorat qilinadigan va samarali qiladi.
Kutubxona va SDK-larni ishlab chiqishda throwing funksiyalari ommaviy shartnomaning bir qismi ekanligini yodda tutish muhim. Xato turi imzoda ko'rsatilmagan, shuning uchun funksiya qanday xatolarni chiqarishi mumkinligini sharhda yoki Result-ga o'xshash enum orqali hujjatlashtiring. Bu API foydalanuvchilariga amalga oshirishga qaramasdan to'g'ri catch bloklarini yozishga yordam beradi.
Asinxron dasturlash kontekstida async/await bilan Do-Catch callback hell muammosini hal qiladi. Ilgari Swift-da asinxron koddagi xatolarni boshqarish completion handler-da Error? tekshiruvi bilan ichma-ich yopilishlarni talab qilardi. async/await va Do-Catch bilan asinxron throwing kodi sinxron kabi ko'rinadi, bu har bir qadamda xatolarni boshqarish bilan murakkab so'rov zanjirlarini o'qish va saqlashni osonlashtiradi.
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("Noma'lum xato: \(error)")
}
Swift throwing funksiyalarini chaqirish uchun uchta variantni taklif qiladi: try, try? va try!. Har bir variant muayyan vazifani hal qiladi va o'z cheklovlariga ega.
try do bloki ichida ishlatiladi va xato catch-da boshqariladi. Bu throwing funksiyalarini chaqirishning asosiy usulidir. Kompilyator try xato tutilishi mumkin bo'lgan kontekstda bo'lishini talab qiladi.
try? throwing funksiyasining natijasini Optional-ga aylantiradi. Agar funksiya xato chiqarsa, try? nil qaytaradi, aks holda — muvaffaqiyatli qiymat bilan Optional. Xatoni e'tiborsiz qoldirish mumkin bo'lgan, ammo muvaffaqiyat ko'rsatkichi kerak bo'lgan chaqiruvlar uchun qulay.
try! xatolarni boshqarishni bostiradi. Agar throwing funksiyasi xato chiqarsa, ilova runtime xatosi bilan tugaydi. try! dan faqat xato mutlaqo mumkin emasligiga ishonchingiz komil bo'lganda foydalaning — masalan, o'rnatilgan resursni yuklashda.
// try? — xatoni e'tiborsiz qoldiramiz, nosozlikda nil olamiz
if let data = try? Data(contentsOf: url) {
processData(data)
}
// try! — faqat xato mutlaqo mumkin bo'lmasa
let bundled = try! String(contentsOfFile: "Assets/default.txt")
// try — do-catch-da standart variant
do {
let result = try performNetworkRequest()
updateUI(result)
} catch {
showError(error)
}
Do-Catch iOS dasturlashda tizim API-lari bilan ishlash uchun faol qo'llaniladi. Oddiy stsenariylarni ko'rib chiqaylik: fayl tizimi bilan ishlash, Core Data va tarmoq so'rovlari.
FileManager-ning ko'plab metodlari throwing hisoblanadi. Do-Catch faylning yo'qligi, resursning bandligi yoki ruxsatlarning etishmasligini to'g'ri boshqarishga imkon beradi.
JSONDecoder orqali JSON-ni tahlil qilish — throwing operatsiyasi. Do-Catch dekodlash xatolari va tarmoq nosozliklarini alohida tutib, foydalanuvchiga aniq xato matnini taqdim etadi.
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)
}
// Boshqarish bilan chaqiruv
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)
}
Dasturchilar, ayniqsa boshqa tillardan kelganlar, Do-Catch dan foydalanishda xarakterli xatolarga yo'l qo'yadilar. Eng keng tarqalganlarini ko'rib chiqaylik.
Tez-tez beriladigan savollar
Swift-da xato stackni ochish bilan exception emas, balki Error protokoliga mos keladigan qiymatdir. Throwing funksiyalari aniq throws bilan belgilanishi kerak va kompilyator chaqirishda try talab qiladi — bu kompilyatsiya bosqichida boshqarilmagan xatolarni istisno qiladi.
Ha, async funksiyalari ham throws bo'lishi mumkin va ular uchun do-catch ishlaydi. Async throwing funksiyasini chaqirish do bloki ichida try await talab qiladi. Bu Swift-ning asinxron kodida xatolarni boshqarishning standart usulidir.
Muqobil variantlar mavjud: try? xatoni nil-ga aylantiradi, try! xatoda crash-ga sabab bo'ladi, rethrows esa xatoni yopilishdan uzatishga imkon beradi. Do-catch aniq boshqarishning asosiy usuli bo'lib qoladi.
Swift chiqarilgan xatolarni tiplamaydi — har qanday throwing funksiyasi Error-ga mos keladigan istalgan turni chiqarishi mumkin. Boshqarishni catch-da aniq xato turlari bo'yicha moslashtirish orqali ajrating.
Ha, bu eng yaxshi amaliyotdir. Error tasdig'i bilan enum sifatida AppError ni aniqlang va tizim xatolarini domen xatolariga aylantiring. Bu boshqarishni birlashtiradi va ilova qatlamini tizim detallaridan izolyatsiya qiladi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.