Xəta idarəetməsi mobil tərtibatçı üçün əsas bacarıqdır. HackerOne (2025)-a görə, məlumat sızmalarının 62%-i idarə olunmayan istisnalar səbəbindən baş verir. Düzgün xəta idarəetməsi nəinki çökmələrin qarşısını alır, həm də istifadəçi məlumatlarını qoruyur. Gəlin iOS, Android və React Native üçün yanaşmaları nəzərdən keçirək.
Əsas məqamlar
Xəta idarəetməsi Swift-də dörd əsas mexanizmə əsaslanır: do-catch, throws, guard let və if-let. Bir çox dillərdən fərqli olaraq, Swift tutulmayan istisnalara icazə vermir — hər bir xəta açıq şəkildə idarə edilməli və ya throws vasitəsilə bəyan edilməlidir. Xəta idarəetməsi mobil inkişaf üçün kritik bir bacarıqdır və birbaşa tətbiqin sabitliyinə təsir göstərir.
do-catch throws ilə işarələnmiş funksiyaları çağırmaq üçün standart blokdur. do daxilində, try ilə bir funksiya çağırılır və o xəta atarsa, nəzarət catch-ə keçir. Müxtəlif xəta növləri pattern matching vasitəsilə idarə edilə bilər. Xəta idarə edilməzsə, o, yığında yuxarıya yayılır (Error Propagation). iOS-da effektiv xəta idarəetməsi üçün do-catch-i əsas mexanizm kimi istifadə edin.
Throw funksiya imzasında bəyan edilir: func fetchData() throws -> Data. Bu o deməkdir ki, çağıran kod xətanı try, try? və ya try! vasitəsilə idarə etməlidir. try? xətanı nil-ə çevirir, try! xəta zamanı çökməyə səbəb olur (yalnız uğura əmin olduqda istifadə edin). throw vasitəsilə xəta idarəetməsi Swift-də məcburi təcrübədir.
Guard let dəyər nil olduqda funksiyadan erkən çıxmaq üçün bir konstruksiyadır. if-let-dən fərqli olaraq, guard let else şaxəsində çıxış (return, throw, break) tələb edir. Bu, kodu daha düz və oxunaqlı edir — iç-içə if blokları olmadan. Optional nil ola bilmirsə — force unwrap (!) istifadə edin, yalnız tam əmin olduqda. Mobil tətbiqdə guard let isteğe bağlı dəyərləri idarə edərkən çökmələrin qarşısını almağa kömək edir.
Optional Chaining (user?.address?.city) və nil-coalescing (??) açmadan optional ilə işləmək üçün sintaktik şəkərdir. IT Sectr-də biz API giriş parametrlərini yoxlamaq üçün guard let istifadə edirik və komandaya açıq şərh olmadan force unwrap-dan qaçmağı tələb edirik. Hər səviyyədə xəta idarəedicisi gözlənilməz nasazlıqlardan qoruyur.
Kotlin Android inkişafı üçün əsas dildir. O, Java-dan try-catch-i miras alır, lakin daha təhlükəsiz alternativlər əlavə edir: elvis operatoru, require, check və sealed class. Kotlin-də xəta idarəetməsi bu mexanizmlərin birləşməsinə əsaslanır. Swift-dən fərqli olaraq, Kotlin yoxlanılmış istisnaları idarə etməyi tələb etmir (bütün istisnalar yoxlanılmamışdır). Android-də mobil tətbiqlərdə xəta idarəetməsi üçün sealed class-ı əsas nümunə kimi istifadə edin.
Try-catch Kotlin-də ifadə kimi işləyir — dəyər qaytarır. val result = try { fetchData() } catch (e: Exception) { fallbackValue }. Bu kodu qısaldır. Elvis operatoru (?:) nullable tiplər üçün nil-coalescing-in analoqudur: val name = user?.name ?: "Guest". Mobil tətbiqlərdə xəta idarəetməsi üçün ifadə kimi try-catch ən qısa yanaşmadır.
Sealed class uğur və xəta vəziyyətlərini modelləşdirmək üçün güclü bir vasitədir. sealed class NetworkResult { data class Success(val data: T) : NetworkResult(); data class Error(val message: String) : NetworkResult() }. when ifadəsində istifadə edildikdə, kompilyator şaxələrin tamlığını yoxlayır. sealed class vasitəsilə xəta idarəetməsi heç bir vəziyyətin idarə olunmamış qalmamasını təmin edir.
// Sealed class + try-catch — Android üçün tipik nümunə
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}")
}
}
Nümunədə, sealed class NetworkResult iki vəziyyəti modelləşdirir: məlumatla uğur və mesajla xəta. fetchUser funksiyası hər halda nəticə qaytarır və çağıran kod when vasitəsilə hər iki şaxəni idarə edir. Bu, idarə olunmamış xəta ehtimalını aradan qaldırır. sealed class vasitəsilə xəta idarəetməsi IT Sectr-də Android inkişafı üçün standartdır.
Result uğursuz ola biləcək bir əməliyyatın nəticəsini təmsil etmək üçün daxili Kotlin tipidir. O, fold, getOrThrow və ya map vasitəsilə uğur və uğursuzluğun idarə edilməsini məcbur edir. Result asinxron zəncirlərdə (coroutines) faydalıdır. Result ilə xəta idarəetməsi Kotlin-də mobil inkişaf üçün standartdır.
Either Arrow kitabxanasından funksional bir tipdir və iki tipdən birinin dəyərini qaytarmağa imkan verir (Left — xəta, Right — uğur). Result-dan fərqli olaraq, Either istənilən istifadəçi tərəfindən təyin edilmiş xəta tipini ehtiva edə bilər. Sadə layihələr üçün daxili Result kifayətdir; mürəkkəb layihələr üçün Arrow-dan Either istifadə edin. Xəta idarəetmə alətinin seçimi layihənin mürəkkəbliyindən asılıdır.
Xəta yayılması xətanın idarə olunana qədər çağırış yığınında yuxarıya yayıldığı bir mexanizmdir. Kotlin-də bu, standart olaraq baş verir (yoxlanılmamış istisnalar). Swift-də bu, yalnız throws ilə işarələnmiş funksiyalara aiddir. Result və Either ilə xətalar yayılmır — onlar tipdə qalır və siz onları idarə etməlisiniz. Bu, mobil tətbiqlərdə xəta idarəetməsini daha təhlükəsiz edir.
| Parametr | iOS (Swift) | Android (Kotlin) |
|---|---|---|
| Əsas mexanizm | do-catch + throws | try-catch (expression) |
| Optional/Nullable | guard let, if-let, ?? | ?. let, elvis (?:) |
| Funksional yanaşma | Result (Swift 5+) | Result, Either (Arrow) |
| Xəta modelləşdirmə | Enum: Error | Sealed class |
| Yoxlanılmış istisnalar | Bəli (throws) | Xeyr (hamısı yoxlanılmamış) |
| Qeyri-ölümcül | os_log, Crashlytics | Timber, Crashlytics |
Cədvəl əsas fərqləri göstərir. iOS açıq xəta bəyannaməsi (throws) tələb edir, bu da kodu daha təhlükəsiz, lakin daha ətraflı edir. Android tərtibatçı intizamına əsaslanır. IT Sectr-də biz Android üçün sealed class və iOS üçün throws istifadə edirik — bu, mobil tətbiqlərdə xəta idarəetməsi üçün hər iki platformanın ən yaxşı təcrübəsidir.
Çökmə hesabatı tətbiq çökmələrini toplamaq və təhlil etmək sistemidir. Çökmə hesabatı istehsalda xəta idarəetməsinin vacib hissəsidir. Onsuz, problemləri istifadəçilərdən öyrənirsiniz, bu isə istehsal üçün qəbuledilməzdir. İki əsas alət: Firebase Crashlytics (pulsuz) və Sentry (əsas istifadə üçün pulsuz). Mobil tətbiqlərdə xəta idarəetməsi üçün ilk buraxılışdan etibarən çökmə hesabatını tətbiq edin.
Crashlytics Firebase-in bir hissəsidir. O, avtomatik olaraq çökmələri toplayır, çağırış yığınına görə qruplaşdırır və təsirlənmiş istifadəçilərin sayını göstərir. O, recordException() vasitəsilə ölümcül olmayan xətaların qeydiyyatını dəstəkləyir. İnteqrasiya: build.gradle (Android) və ya Podfile (iOS)-a SDK əlavə edin. Crashlytics layihəyə başlayarkən xəta idarəetməsi üçün ən yaxşı pulsuz alətdir.
Sentry çarpaz platformalı xəta monitorinq sistemidir. Crashlytics-dən fərqli olaraq, Sentry ətraflı izləmə (breadcrumbs), performans monitorinqi və React Native dəstəyi təmin edir. Xəta anında tətbiqin vəziyyətini görməyə imkan verir. IT Sectr mobil inkişafda xəta idarəetməsi üzərində tam nəzarətə ehtiyacı olan layihələr üçün Sentry-i tövsiyə edir.
Error Boundary uşaq komponent ağacında JavaScript səhvlərini tutan və ehtiyat istifadəçi interfeysi göstərərək tətbiqin tam çökməsinin qarşısını alan React komponentidir. Error Boundary React Native-də xəta idarəetməsi üçün əsas komponentdir. Kritik ekranlar və naviqasiya üçün error boundaries istifadə edin. React Native-də mobil tətbiqlərdə xəta idarəetməsi yuxarı səviyyədə düzgün Error Boundary qurulmasını tələb edir.
Error Boundary componentDidCatch(error, errorInfo) və ya static getDerivedStateFromError(error) vasitəsilə yaradılır. O, asinxron koddakı (setTimeout, requestAnimationFrame), server tərəfli renderinqdəki və ya yerli səhvlərdəki (Native Modules) xətaları tutmur. Qeydiyyat üçün componentDidCatch daxilində çökmə hesabatı SDK-sından istifadə edin. Error Boundary UI təbəqəsi üçün sadə, lakin effektiv xəta idarəedicisidir.
Ölümcül xəta tətbiqin çökməsinə səbəb olan idarə olunmamış istisnadır. Qeyri-ölümcül xəta tutduğunuz və idarə etdiyiniz, lakin kodda bir problemi göstərən istisnadır. Qeyri-ölümcül xətalar Crashlytics/Sentry vasitəsilə qeydə alınır və ölümcül olmamışdan əvvəl səhvləri tapmağa kömək edir. Həm ölümcül, həm də qeyri-ölümcül xətalar mobil inkişafda düzgün xəta idarəetməsi tələb edir.
Tez-tez verilən suallar
try-catch istisnalar üçün dil mexanizmidir. Result kompilyasiya vaxtında xəta idarəetməsini məcbur edən bir sarma tipidir. IT Sectr-də biz biznes məntiqi üçün Result-a və xarici sistemlərlə işləmək üçün try-catch-ə üstünlük veririk. Hər iki yanaşma Kotlin-də ümumi xəta idarəetməsinin bir hissəsidir.
Error Boundary uşaq komponent ağacında JavaScript səhvlərini tutan və bütün tətbiqi çökdürmək əvəzinə ehtiyat istifadəçi interfeysi göstərən React komponentidir. O, asinxron koddakı və ya server tərəfli renderinqdəki xətaları tutmur. Error Boundary React Native-də mobil tətbiqlərdə xəta idarəetməsinin vacib elementidir.
Crashlytics (Firebase) başlamaq üçün ən yaxşı seçimdir: pulsuz, sadə inteqrasiya, avtomatik çökmə qruplaşdırması. Sentry ətraflı xəta izləmə və performans monitorinqi tələb edən layihələr üçündür. Xəta idarəetmə alətinin seçimi büdcə və monitorinq tələblərindən asılıdır.
Ölümcül xəta tətbiq çökməsidir (tutulmamış istisna). Qeyri-ölümcül xəta tutduğunuz və idarə etdiyiniz, lakin kodda bir problemi göstərən istisnadır. Qeyri-ölümcül xətalar ayrıca qeydə alınır və ölümcül olmamışdan əvvəl səhvləri tapmağa kömək edir. Mobil tətbiqdə xəta idarəetməsi hər iki növün monitorinqini əhatə etməlidir.
guard let dəyər olmadıqda funksiyadan erkən çıxmaq üçün istifadə olunur — bu, kodu daha xətti və oxunaqlı edir. if-let bir blok daxilində optional lazım olduqda və funksiyadan çıxış tələb olunmadıqda uyğundur. guard let giriş parametrlərini yoxlamaq üçün üstünlük təşkil edir və iOS-da xəta idarəetməsinin bir hissəsidir.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.