Mobil rivojlanishda xatolarni boshqarish: bu nima, qanday texnikalar va qanday tashkil qilish

Muallif: IT Sectr Nashr etilgan: 2026-05-23 O'qish vaqti: 11 daq

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

  • iOS xatolarni boshqarish uchun do-catch, throw, guard let va if-let dan foydalanadi. Swift til darajasida boshqarilmagan istisnolarga yo'l qo'ymaydi.
  • Android/Kotlin try-catch, elvis operatori, sealed class va Result turini taklif qiladi. Sealed class xato holatlarini modellashtirish uchun kuchli vositadir.
  • Kotlin Result va funksional kutubxonalardan Either xatolarni kompilyatsiya vaqtida boshqarishga majbur qiladi, kodni ishonchliroq qiladi.
  • Crash Reporting (Crashlytics, Sentry) ishlab chiqarish uchun majburiy vositadir. Usiz, xatolar haqida faqat foydalanuvchilardan bilib olasiz.
  • React Native-dagi Error Boundary JavaScript xatolari tufayli ilovaning to'liq qulashini oldini oladi. Uni ildiz komponentlari uchun ishlating.

iOS-da Xatolarni Boshqarish: Do-Catch, Throw, Guard Let

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 va Throw

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.

Optional/Nullable va Guard Let

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.

Android-da Xatolarni Boshqarish: Try-Catch, Elvis, Sealed Class

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 va Elvis operatori

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.

kotlin
// 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.

Kotlin-da Xatolarni Boshqarish: Result va Either

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.

Result vs Either

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 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 mexanizmdo-catch + throwstry-catch (expression)
Optional/Nullableguard let, if-let, ???. let, elvis (?:)
Funksional yondashuvResult (Swift 5+)Result, Either (Arrow)
Xato modellashtirishEnum: ErrorSealed class
Tekshirilgan istisnolarHa (throws)Yo'q (barchasi tekshirilmagan)
O'limsiz xatolaros_log, CrashlyticsTimber, 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: Crashlytics va Sentry

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.

Firebase Crashlytics

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

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.

React Native-da Error Boundary

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 ni joriy qilish

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 va O'limsiz Xatolar

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

Kotlin-da try-catch va Result o'rtasidagi farq nima?

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.

React Native-da Error Boundary nima?

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.

Yangi loyiha uchun Crashlytics yoki Sentry dan foydalanishim kerakmi?

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'limsiz xato nima va u o'limli xatodan qanday farq qiladi?

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.

Swift-da if-let o'rniga qachon guard let dan foydalanish 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

  • iOS do-catch, throws va guard let dan foydalanadi — har bir xato funksiya imzosida e'lon qilinishi kerak. iOS-da xatolarni boshqarish aniq deklaratsiyalarni talab qiladi.
  • Android/Kotlin ifoda sifatida try-catch, elvis operatori va xato modellashtirish uchun sealed class taklif qiladi. Android-da xatolarni boshqarish moslashuvchanroq, ammo intizom talab qiladi.
  • Sealed class va Result Kotlin-da funksional xatolarni boshqarish uchun eng yaxshi amaliyotlardir. Ular boshqarilmagan holatlarni yo'q qiladi.
  • Qulash Hisoboti (Crashlytics, Sentry) ishlab chiqarish uchun majburiydir. Crashlytics bilan boshlang, loyiha o'sishi bilan Sentry-ga o'ting. Monitoringiz mobil ilovalarda xatolarni boshqarish mumkin emas.
  • React Native-da Error Boundary to'liq UI qulashlarini oldini oladi. Yuqori navigatsiya darajasida foydalaning.
  • O'limsiz xatolar o'limli xatolar kabi muhim — ular ilova qulashidan oldin muammolarni ko'rsatadi. Xato boshqaruvchisi ikkala turni qayd etishi kerak.
  • Global Exception Handler so'nggi himoya chizig'idir. Barcha ushlanmagan xatolarni qayd etish uchun Thread.setDefaultUncaughtExceptionHandler (Android) yoki NSSetUncaughtExceptionHandler (iOS) ni joriy qiling.

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.

Loyihani muhokama qilish