Non-Fatal Error — tətbiqin işini dayandırmayan və proqramın icrasını davam etdirməyə imkan verən xətadır. Fatal errordan fərqli olaraq, qeyri-fatal xətalar istifadəçi sessiyasını itirmədən tutula, idarə oluna və loglana bilər. Firebase Crashlytics Documentation, 2024 məlumatına görə, production tətbiqlərində qeydə alınan bütün xətaların təxminən 70%-i qeyri-fataldır, lakin onlara məhəl qoymamaq texniki borcun yığılmasına və istifadəçi təcrübəsinin tədricən pisləşməsinə gətirib çıxarır. Non-fatal xətaların düzgün idarə olunması mobil tərtibatçının əsas bacarıqlarından biridir.
Əsas məqamlar
Non-Fatal Error — prosesin dayandırılmasına səbəb olmayan istisna və ya xəta vəziyyətidir. Tətbiq işləməyə davam edir, lakin düzgün olmayan vəziyyətdə ola bilər: məlumatlar yüklənməyib, sorğu göndərilməyib, interfeys elementi göstərilməyib. İstifadəçi ya xətanı görmür, ya da mesaj görür və tətbiqdən istifadəni davam etdirir.
Qeyri-fatal xəta həmişə proqrama bərpa yolu qoyur. Xəta idarəedicisi alternativ məlumatlar təklif edə, əməliyyatı təkrarlaya və ya interfeysin əvəzedicisini göstərə bilər. Əsas vəzifə crashın qarşısını almaq və istifadəçi təcrübəsini məqbul səviyyədə saxlamaqdır. Tərtibatçı hər catch blokunda açıq şəkildə bərpa ssenarisini nəzərdə tutmalıdır.
Instabug 2024 məlumatına görə, istifadəçilərin 65%-i iki uğursuz qarşılıqlı əlaqədən sonra tətbiqi silir. Diqqətdən kənar qalan non-fatal xətalar yığılır və ümumi iş keyfiyyətini aşağı salır. Qeyri-fatal xətaların sistematik şəkildə loglanması və düzəldilməsi retentionu artırmaq və tətbiq mağazalarında istifadəçi reytinqlərini yaxşılaşdırmaq üçün birbaşa yoldur.
Şəbəkə xətaları — mobil tətbiqlərdə ən geniş yayılmış non-fatal xəta növüdür. Bağlantı vaxtının aşılması, şəbəkənin itirilməsi, səhv server status kodu — bütün bu hallar crash olmadan tutulur və idarə olunur. İstifadəçiyə xidmətin əlçatan olmadığı barədə mesaj göstərilir və cəhdi təkrarlamaq təklif olunur. Şəbəkə xətaları üçün eksponensial gecikmə ilə retry nümunəsi xarakterikdir.
Server cavabının səhv formatı, məcburi sahənin olmaması, səhv məlumat tipi — parsing xətaları tətbiq səhv məlumatları düzgün idarə edərsə, qeyri-fatal olur. Tipik yanaşma — standart ehtiyat dəyərlərdən istifadə və sonrakı server analizi üçün sorğu konteksti ilə parsing xətasının loglanmasıdır.
Şəkillərin yüklənməsi ilə bağlı problemlər, səhv şriftlər, layout xətaları — bunların heç biri fatal deyil, lakin istifadəçi təəssüratını pisləşdirir. Placeholder şəkillər və fallback dəyərlər boş ekranların qarşısını almağa və xətaları daha az nəzərə çarpdirmağa imkan verir. React Native-də UI xətaları üçün ehtiyat komponenti göstərən Error Boundary istifadə olunur.
Hesablamalarda səhvlər, vəziyyət uyğunsuzluqları, ekranlar arasında səhv keçidlər — məntiqi xətalar çox vaxt crasha səbəb olmur, lakin tətbiqin səhv davranmasına gətirib çıxarır. Onları sistematik loglama və monitorinq olmadan aşkar etmək daha çətindir, çünki crash hesabatı yaratmır və istifadəçi şikayətinə qədər nəzərə çarpmır.
Non-Fatal Error fataldan onunla fərqlənir ki, proqrama işi davam etdirmək imkanı verir. Fatal error — tətbiqin bərpa edə bilmədiyi vəziyyətdir: null göstəricinin dereferensiyası, stack-in daşması, yaddaşın çatışmazlığı. Non-fatal xətanı tutmaq, idarə etmək və icranı davam etdirmək olar, fatal error isə tətbiqin yenidən başladılmasını tələb edir.
| Xüsusiyyət | Non-Fatal Error | Fatal Error |
|---|---|---|
| Tətbiqin dayandırılması | Xeyr | Bəli |
| Bərpa imkanı | Bəli, catch bloku ilə | Xeyr |
| Loglama | Koddan recordException ilə | Yalnız crash raporteri ilə |
| UX təsiri | Müvəqqəti narahatlıq | Sessiyanın tam itirilməsi |
| Nümunə | Network timeout, parse error | NullPointerException, OOM |
Non-fatal və fatal arasındakı sərhəd tətbiqdan asılı ola bilər. Şəbəkə vaxt aşımı bir tətbiqdə non-fatal kimi idarə olunur (sorğunun 1–2 saniyədən sonra təkrarlanması), digərində fatal ola bilər (idarəedici olmadıqda crash). Keyfiyyətli xəta idarəetməsi potensial fatal halları qeyri-fatala çevirir, tətbiqin sabitliyini artırır. Xəta idarəetmə sisteminin layihələndirilməsi yüksək etibarlılıq tələbləri olan mobil tətbiqin hazırlanmasında əsas memarlıq vəzifələrindən biridir. Quraşdırılmış monitorinq sistemi komandaya qeyri-fatal xətaları əhəmiyyətli sayda istifadəçiyə təsir etməzdən əvvəl tez aşkar etməyə və aradan qaldırmağa imkan verir.
Firebase Crashlytics — mobil tətbiqlərdə qeyri-fatal xətaların loglanması üçün əsas vasitədir. recordException metodu tətbiqin işini kəsmədən tam stack trace və icra konteksti ilə non-fatal istisnanı qeydə almağa imkan verir. Crash hesabatlarından fərqli olaraq, recordException tutulan istisnaları loglamaq üçün kodun istənilən yerində çağırıla bilər.
fun fetchUserData(userId: String) {
try {
val response = apiService.getUser(userId)
updateUI(response)
} catch (e: IOException) {
Crashlytics.log("Network error for user $userId")
Crashlytics.recordException(e)
showRetryDialog()
} catch (e: JsonParseException) {
// Non-fatal: ehtiyat məlumatlardan istifadə edirik
Crashlytics.recordException(e)
showFallbackContent()
}
}
// İstifadəçi açarları ilə loglama
Crashlytics.setCustomKey("screen", "Profile")
Crashlytics.setCustomKey("api_version", "v3")
Sentry — daha ətraflı non-fatal xəta diaqnostikası ilə Crashlytics-ə alternativdir. Sentry SDK serverə istisna təfərrüatlarını göndərən captureException metodunu təqdim edir. Sentry-nin əsas üstünlüyü oxşar non-fatal xətaların bir issue-də qruplaşdırılması, təkrarlanma tezliyinin təhlili və breadcrumbs — xətadan əvvəl istifadəçi hərəkətlərinin ardıcıllığı şəklində icra kontekstidir.
Bütün non-fatal xətaları loglamaq lazım deyil. Gözlənilən hallar — bağlantı olmadıqda şəbəkə çatışmazlığı — seçmə şəkildə loglana bilər. Gözlənilməz xətalar — idarə olunan koddakı NullPointerException, səhv məlumat formatı, logic error — həmişə loglanmalıdır. Hər komanda əhəmiyyət həddini özü müəyyən edir: gündə 1000 istifadəçiyə 10-dan 20-yə qədər unikal non-fatal xəta norma hesab olunur. Non-fatal xətaların sayının kəskin artmasına alertlər qurmaq vacibdir — bu, API-nin yeni versiyası ilə bağlı problemləri və ya buraxılışdan sonrakı reqressiyanı göstərə bilər.
Əsas idarəetmə mexanizmi — istisnanı tutan və bərpa kodunu icra edən try-catch-dir. Şəbəkə əməliyyatları üçün tipik nümunə — eksponensial gecikmə ilə sorğunun təkrarlanması (retry with backoff). Parsing xətaları üçün — standart ehtiyat dəyərlərdən istifadə və sonrakı server təhlili üçün kontekstin loglanması.
func loadImage(from url: URL) -> UIImage? {
do {
let data = try Data(contentsOf: url)
return UIImage(data: data)
} catch {
Logger.shared.logError(error: "Image load failed: \(url)")
return UIImage(named: "placeholder")
}
}
func performRequest() async throws -> Data {
var lastError: Error? = nil
for attempt in 0..<3 {
do {
return try await URLSession.shared.data(from: url)
} catch {
lastError = error
try await Task.sleep(UInt64(pow(2, attempt)) * 1_000_000_000)
}
}
throw lastError ?? URLError(.unknown)
}
Result tipləri — istisnasız alternativ yanaşma. Funksiya Success və Failure variantları ilə sealed class Result qaytarır. Çağıran kod hər iki variantı açıq şəkildə idarə edir, bu da idarə olunmamış xətaları aradan qaldırır. Result tipləri tiplər səviyyəsində non-fatal halların açıq idarə edilməsi üçün Kotlin (standart kitabxanada Result
Hər bir non-fatal xəta növü üçün bərpa strategiyası nəzərdə tutulmalıdır: şəbəkə xətası zamanı keşlənmiş məlumatların yüklənməsi, parsing xətası zamanı standart dəyərlərdən istifadə, UI xətası zamanı komponentin yenidən işə salınması. Yaxşı təcrübə — istifadəçiyə xəta barədə toast və ya snackbar göstərmək, lakin tətbiqlə qarşılıqlı əlaqəni tamamilə bloklamamaqdır. Bərpa olunan (recoverable) və bərpa olunmayan xətaları fərqləndirmək vacibdir — ikincilər üçün bərpa strategiyası fərqli olacaq, məsələn, ekranı yenidən başlatmaq və ya məlumatları təmizləmək təklifi. Əvvəlki uğurlu vəziyyətin keşlənməsi çox vaxt mobil platformalarda non-fatal xətaların idarə edilməsinin ən sadə və ən effektiv üsulu olur.
Tez-tez verilən suallar
Warning — bu, kodda potensial problem barədə kompilyatorun və ya statik analizatorun xəbərdarlığıdır. Non-fatal error — artıq baş vermiş, lakin crasha səbəb olmamış runtime istisnasıdır. Warning kompilyasiyadan əvvəl aradan qaldırıla bilər, non-fatal error — catch bloku vasitəsilə icra zamanı idarə oluna bilər.
Xeyr, həddindən artıq loglama monitorinqi zibilləyir. Production-da gözlənilməz xətaları loglamaq və gözlənilən hallara məhəl qoymamaq daha yaxşıdır: bağlantı olmadıqda şəbəkə çatışmazlığı seçmə loglanır, idarə olunan koddakı NullPointerException isə həmişə. Hər komanda tətbiq kontekstindən çıxış edərək əhəmiyyət həddini müəyyən edir.
SwiftUI-də xəta vəziyyətini izləmək üçün @Published errorState sahəsi olan ObservableObject istifadə olunur. View dəyişikliklərə abunə olur və alternativ məzmun göstərir. iOS 17-dən əvvəl Combine prosedurları tətbiq olunurdu, iOS 17-dən etibarən — UI-nin reaktiv yenilənməsi üçün SwiftData və @Observable makrosları.
Bəli, əgər xəta zəncirvari reaksiyaya səbəb olarsa. Nümunə: şəklin yüklənməsinin qeyri-fatal səhvi UI-nin səhv vəziyyətinə gətirib çıxara bilər, bu da göstərilməyə cəhd edərkən crasha səbəb olur. Hər səviyyədə non-fatal xətaların keyfiyyətli idarə edilməsi onların fatal səviyyəyə yüksəlməsinin qarşısını alır.
iOS-da non-fatal xətalar do-catch və throw ilə idarə olunur, Android-də — try-catch və istisnalarla. iOS NSError-dan domenlər və xəta kodları ilə istifadə edir, Android — Java/Kotlin istisnaları. Crashlytrics hər iki platformada eyni şəkildə recordException vasitəsilə işləyir, monitorinq üçün vahid interfeys təmin edir.
Nəticə
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.
Həm də oxuyun