Xatolarni boshqarish mobil dasturchi uchun asosiy mahoratdir. HackerOne (2025) ma'lumotlariga ko'ra, ma'lumotlar sizib chiqishining 62% boshqarilmagan istisnolar tufayli sodir bo'ladi. Xatolarni to'g'ri boshqarish nafaqat qulashlarni oldini oladi, balki foydalanuvchi ma'lumotlarini ham himoya qiladi. Keling, iOS, Android va React Native uchun yondashuvlarni ko'rib chiqaylik.
Asosiy fikrlar
Xatolarni boshqarish Swift-da to'rtta asosiy mexanizmga asoslangan: do-catch, throws, guard let va if-let. Ko'pgina tillardan farqli o'laroq, Swift ushlanmagan istisnolarga yo'l qo'ymaydi — har bir xato aniq boshqarilishi yoki throws orqali e'lon qilinishi kerak. Xatolarni boshqarish mobil rivojlanish uchun muhim mahorat bo'lib, ilova barqarorligiga bevosita ta'sir qiladi.
do-catch throws bilan belgilangan funksiyalarni chaqirish uchun standart blokdir. do ichida, try bilan funksiya chaqiriladi va agar u xato tashlasa, boshqaruv catch-ga o'tadi. Har xil xato turlari pattern matching orqali boshqarilishi mumkin. Agar xato boshqarilmasa, u stekda yuqoriga tarqaladi (Error Propagation). iOS-da samarali xatolarni boshqarish uchun do-catch-ni asosiy mexanizm sifatida ishlating.
Throw funksiya imzosida e'lon qilinadi: func fetchData() throws -> Data. Bu chaqiruvchi kod try, try? yoki try! orqali xatoni boshqarishi kerakligini anglatadi. try? xatoni nil-ga aylantiradi, try! xato paytida qulashga sabab bo'ladi (faqat muvaffaqiyatga ishonchingiz komil bo'lganda foydalaning). throw orqali xatolarni boshqarish Swift-da majburiy amaliyotdir.
Guard let qiymat nil bo'lsa, funksiyadan erta chiqish uchun konstruktsiyadir. if-let-dan farqli o'laroq, guard let else tarmog'ida chiqish (return, throw, break) talab qiladi. Bu kodni tekisroq va o'qilishi osonroq qiladi — ichma-ich if bloklarisiz. Agar optional nil bo'lolmasa — force unwrap (!) dan foydalaning, faqat to'liq ishonchingiz komil bo'lganda. Mobil ilovada guard let ixtiyoriy qiymatlarni boshqarishda qulashlarning oldini olishga yordam beradi.
Optional Chaining (user?.address?.city) va nil-coalescing (??) ochmasdan optional bilan ishlash uchun sintaktik shakardir. IT Sectr-da biz API kirish parametrlarini tekshirish uchun guard let dan foydalanamiz va jamoaga aniq izohsiz force unwrap-dan qochishni talab qilamiz. Har bir darajadagi xato boshqaruvchisi kutilmagan nosozliklardan himoya qiladi.
Kotlin Android rivojlanishi uchun asosiy tildir. U Java-dan try-catch-ni meros qilib oladi, ammo xavfsizroq alternativlarni qo'shadi: elvis operatori, require, check va sealed class. Kotlin-da xatolarni boshqarish bu mexanizmlarning kombinatsiyasiga asoslangan. Swift-dan farqli o'laroq, Kotlin tekshirilgan istisnolarni boshqarishni talab qilmaydi (barcha istisnolar tekshirilmagan). Android-da mobil ilovalarda xatolarni boshqarish uchun sealed class-ni asosiy naqsh sifatida ishlating.
Try-catch Kotlin-da ifoda sifatida ishlaydi — qiymat qaytaradi. val result = try { fetchData() } catch (e: Exception) { fallbackValue }. Bu kodni qisqartiradi. Elvis operatori (?:) nullable turlari uchun nil-coalescing-ning analogidir: val name = user?.name ?: "Guest". Mobil ilovalarda xatolarni boshqarish uchun ifoda sifatida try-catch eng qisqa yondashuvdir.
Sealed class muvaffaqiyat va xato holatlarini modellashtirish uchun kuchli vositadir. sealed class NetworkResult { data class Success(val data: T) : NetworkResult(); data class Error(val message: String) : NetworkResult() }. when ifodasida ishlatilganda, kompilyator tarmoqlarning to'liqligini tekshiradi. sealed class orqali xatolarni boshqarish hech qanday holat boshqarilmay qolmasligini kafolatlaydi.
// Sealed class + try-catch — Android uchun odatiy naqsh
sealed class NetworkResult<out T> {
data class Success<out T>(val data: T) : NetworkResult<T>()
data class Error(val message: String) : NetworkResult<Nothing>()
}
fun fetchUser(id: String): NetworkResult<User> {
return try {
NetworkResult.Success(api.getUser(id))
} catch (e: Exception) {
NetworkResult.Error("Failed: ${e.message}")
}
}
Misolda, sealed class NetworkResult ikkita holatni modellashtiradi: ma'lumot bilan muvaffaqiyat va xabar bilan xato. fetchUser funksiyasi har qanday holatda natija qaytaradi va chaqiruvchi kod when orqali ikkala tarmoqni boshqaradi. Bu boshqarilmagan xato ehtimolini yo'q qiladi. sealed class orqali xatolarni boshqarish IT Sectr-da Android rivojlanishi uchun standartdir.
Result muvaffaqiyatsiz bo'lishi mumkin bo'lgan operatsiya natijasini ifodalash uchun o'rnatilgan Kotlin turidir. U fold, getOrThrow yoki map orqali muvaffaqiyat va muvaffaqiyatsizlikni boshqarishga majbur qiladi. Result asinxron zanjirlarda (coroutines) foydalidir. Result bilan xatolarni boshqarish Kotlin-da mobil rivojlanish uchun standartdir.
Either Arrow kutubxonasidan funksional turdir va ikki turdan birining qiymatini qaytarishga imkon beradi (Left — xato, Right — muvaffaqiyat). Result-dan farqli o'laroq, Either har qanday foydalanuvchi tomonidan belgilangan xato turini o'z ichiga olishi mumkin. Oddiy loyihalar uchun o'rnatilgan Result yetarli; murakkab loyihalar uchun Arrow-dan Either dan foydalaning. Xatolarni boshqarish vositasini tanlash loyiha murakkabligiga bog'liq.
Xato tarqalishi xato boshqarilgunga qadar qo'ng'iroqlar stekida yuqoriga tarqaladigan mexanizmdir. Kotlin-da bu standart bo'yicha sodir bo'ladi (tekshirilmagan istisnolar). Swift-da bu faqat throws bilan belgilangan funksiyalarga tegishli. Result va Either bilan xatolar tarqalmaydi — ular turda qoladi va siz ularni boshqarishingiz kerak. Bu mobil ilovalarda xatolarni boshqarishni xavfsizroq qiladi.
| Parametr | iOS (Swift) | Android (Kotlin) |
|---|---|---|
| Asosiy mexanizm | do-catch + throws | try-catch (expression) |
| Optional/Nullable | guard let, if-let, ?? | ?. let, elvis (?:) |
| Funksional yondashuv | Result (Swift 5+) | Result, Either (Arrow) |
| Xato modellashtirish | Enum: Error | Sealed class |
| Tekshirilgan istisnolar | Ha (throws) | Yo'q (barchasi tekshirilmagan) |
| O'limsiz xatolar | os_log, Crashlytics | Timber, Crashlytics |
Jadval asosiy farqlarni ko'rsatadi. iOS aniq xato deklaratsiyasini (throws) talab qiladi, bu kodni xavfsizroq, ammo batafsilroq qiladi. Android dasturchi intizomiga tayanadi. IT Sectr-da biz Android uchun sealed class va iOS uchun throws dan foydalanamiz — bu mobil ilovalarda xatolarni boshqarish uchun ikkala platformaning eng yaxshi amaliyotidir.
Qulash hisoboti ilova qulashlarini to'plash va tahlil qilish tizimidir. Qulash hisoboti ishlab chiqarishda xatolarni boshqarishning muhim qismidir. Usiz, muammolar haqida foydalanuvchilardan bilib olasiz, bu ishlab chiqarish uchun qabul qilib bo'lmaydi. Ikkita asosiy vosita: Firebase Crashlytics (bepul) va Sentry (asosiy foydalanish uchun bepul). Mobil ilovalarda xatolarni boshqarish uchun birinchi nashrdan boshlab qulash hisobotini joriy qiling.
Crashlytics Firebase-ning bir qismidir. U avtomatik ravishda qulashlarni to'playdi, ularni qo'ng'iroqlar stekiga ko'ra guruhlaydi va ta'sirlangan foydalanuvchilar sonini ko'rsatadi. U recordException() orqali o'limsiz xatolarni qayd etishni qo'llab-quvvatlaydi. Integratsiya: build.gradle (Android) yoki Podfile (iOS) ga SDK qo'shing. Crashlytics loyihani boshlashda xatolarni boshqarish uchun eng yaxshi bepul vositadir.
Sentry o'zaro platformali xato monitoring tizimidir. Crashlytics-dan farqli o'laroq, Sentry batafsil kuzatish (breadcrumbs), ishlash monitoringi va React Native qo'llab-quvvatlashni ta'minlaydi. Xato paytida ilova holatini ko'rish imkonini beradi. IT Sectr mobil rivojlanishda xatolarni boshqarish ustidan to'liq nazoratga muhtoj loyihalar uchun Sentry-ni tavsiya qiladi.
Error Boundary bola komponentlar daraxtida JavaScript xatolarini ushlaydigan va zaxira foydalanuvchi interfeysini ko'rsatadigan, ilovaning to'liq qulashini oldini oladigan React komponentidir. Error Boundary React Native-da xatolarni boshqarish uchun asosiy komponentdir. Kritik ekranlar va navigatsiya uchun error boundaries dan foydalaning. React Native-da mobil ilovalarda xatolarni boshqarish yuqori darajada to'g'ri Error Boundary sozlashni talab qiladi.
Error Boundary componentDidCatch(error, errorInfo) yoki static getDerivedStateFromError(error) orqali yaratiladi. U asinxron koddagi (setTimeout, requestAnimationFrame), server tomoni renderlashdagi yoki mahalliy xatolardagi (Native Modules) xatolarni ushlamaydi. Qayd etish uchun componentDidCatch ichida qulash hisoboti SDK-sidan foydalaning. Error Boundary UI qatlami uchun sodda, ammo samarali xato boshqaruvchisidir.
O'limli xato ilova qulashiga olib keladigan boshqarilmagan istisnodir. O'limsiz xato siz ushlagan va boshqargan, ammo kodda muammoni ko'rsatadigan istisnodir. O'limsiz xatolar Crashlytics/Sentry orqali qayd etiladi va o'limli bo'lishidan oldin xatolarni topishga yordam beradi. Ham o'limli, ham o'limsiz xatolar mobil rivojlanishda to'g'ri xatolarni boshqarishni talab qiladi.
Tez-tez so'raladigan savollar
try-catch istisnolar uchun til mexanizmidir. Result kompilyatsiya vaqtida xatolarni boshqarishga majbur qiladigan o'rovchi turidir. IT Sectr-da biz biznes mantig'i uchun Result-ni va tashqi tizimlar bilan ishlash uchun try-catch-ni afzal ko'ramiz. Ikkala yondashuv Kotlin-da umumiy xatolarni boshqarishning bir qismidir.
Error Boundary bola komponentlar daraxtida JavaScript xatolarini ushlaydigan va butun ilovani qulatish o'rniga zaxira foydalanuvchi interfeysini ko'rsatadigan React komponentidir. U asinxron kod yoki server tomoni renderlashdagi xatolarni ushlamaydi. Error Boundary React Native-da mobil ilovalarda xatolarni boshqarishning muhim elementidir.
Crashlytics (Firebase) boshlash uchun eng yaxshi tanlovdir: bepul, oddiy integratsiya, avtomatik qulash guruhlash. Sentry batafsil xato kuzatish va ishlash monitoringi kerak bo'lgan loyihalar uchun. Xatolarni boshqarish vositasini tanlash byudjet va monitoring talablariga bog'liq.
O'limli xato ilova qulashidir (ushlanmagan istisno). O'limsiz xato siz ushlagan va boshqargan, ammo kodda muammoni ko'rsatadigan istisnodir. O'limsiz xatolar alohida qayd etiladi va o'limli bo'lishidan oldin xatolarni topishga yordam beradi. Mobil ilovada xatolarni boshqarish ikkala turni monitoring qilishni o'z ichiga olishi kerak.
guard let qiymat yo'q bo'lganda funksiyadan erta chiqish uchun ishlatiladi — bu kodni chiziqli va o'qilishi osonroq qiladi. if-let blok ichida optional kerak bo'lganda va funksiyadan chiqish talab qilinmaganda mos keladi. guard let kirish parametrlarini tekshirish uchun afzal va iOS-da xatolarni boshqarishning bir qismidir.
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.