Fatal Error: bu nədir, əsas səbəbləri və qarşısını almaq üsulları

Müəllif: IT Sectr Dərc olunub: 2026-05-27 Oxuma vaxtı: 8 dəq

Fatal Error — bu tətbiqin işinin dərhal dayandırılmasına səbəb olan kritik səhvdir (crash). Non-fatal error-dan fərqli olaraq, kritik səhv proqramın bərpa olunması üçün heç bir imkan qoymur — proses əməliyyat sistemi və ya icra mühiti tərəfindən qəza rejimində dayandırılır. Firebase Crashlytics 2024 məlumatlarına görə, orta tətbiq hər crash-dan sonra istifadəçilərin 2.5%-ni itirir və kritik səhvlərin aradan qaldırılması mobil inkişafda bir nömrəli prioritetdir. Crash-free rate nə qədər yüksəkdirsə, tətbiqin mağazalardakı reytinqi bir o qədər yüksək və istifadəçi axını bir o qədər az olur.

Başlıca məqamlar

  • Fatal Error — tətbiqin dərhal crash olmasına səbəb olan kritik səhv
  • Null-pointer — mobil tətbiqlərdə kritik səhvlərin ən geniş yayılmış səbəbi
  • Non-Fatal Error — tətbiqi dayandırmayan alternativ səhv növü
  • Crashlytics və Sentry kritik səhvlərin stack trace-lərini avtomatik toplayır
  • Qarşısının alınması — safe unwrapping, defensive programming və test etməni əhatə edir

Fatal Error nədir

Fatal Error — proqramın sonrakı icrasının mümkün olmadığı səhvdir. Əməliyyat sistemi və ya virtual maşın məlumatların zədələnməsinin qarşısını almaq üçün prosesi dayandırır. iOS-da kritik səhv SIGABRT və ya SIGSEGV siqnalına, Android-də isə kök handlerə çatan və prosesi dayandıran idarə olunmayan istisnaya səbəb olur. Tətbiq dərhal bağlanır, istifadəçi əsas ekrana qayıdır.

Kritik səhvin əlamətləri

Kritik səhvin xarakterik əlamətləri: tam stack trace ilə crash hesabatı, tətbiqin gözlənilməz yox olması, sistem jurnalında prosesin dayandırılması haqqında qeyd, bağlanmadan əvvəl qara və ya ağ ekran. İstifadəçi seansı bərpa etmək imkanı olmadan əsas ekranı görür — tətbiqi sıfır vəziyyətdən yenidən başlatmaq lazımdır. iOS-da crash Xcode Organizer vasitəsilə əldə olunan .crash faylına yazılır.

Biznes metrikalara təsiri

Hər crash istifadəçi retensiyasına mənfi təsir göstərir. Google Play Console 2024 məlumatlarına görə, crash-free rate 99.5%-dən aşağı olan tətbiqlər axtarış və tövsiyələrdə aşağı reytinq alır. Crash-rate App Store və Google Play üçün əsas keyfiyyət göstəricilərindən biridir — yüksək kritik səhv səviyyəsi yeniləmələrin dərcini bloklaya bilər. Maliyyə və tibb tətbiqləri üçün crash-free rate 99.9%-dən aşağı qəbuledilməz hesab olunur.

Kritik səhvlərin səbəbləri

Null-pointer dereference — mobil tətbiqlərdə kritik səhvlərin aparıcı səbəbi. Null olan obyektin xassəsinə və ya metoduna müraciət cəhdi Android-də NullPointerException, iOS-da isə EXC_BAD_ACCESS yaradır. JetBrains 2023 məlumatlarına görə, bütün istehsalat crash-lərinin təxminən 28%-i null göstəricilərlə bağlıdır. Kotlin-də null-safety sistemi bu faizi əhəmiyyətli dərəcədə azaldır, lakin force unwrap və Java uyğumluğu problem mənbəyi olaraq qalır.

Index-out-of-bounds

Mövcud olmayan indeks üzrə kolleksiya elementinə müraciət — crash-lərin tezliyə görə ikinci səbəbi. Java və Kotlin-də bu ArrayIndexOutOfBoundsException, Swift-də isə fatal error: Index out of range şəklindədir. Əksər hallarda filtrləmə və ya kolleksiyanın dinamik ölçüsü dəyişikliyindən sonra siyahılarla işləyərkən baş verir. getOrNull (Kotlin) və ya indices.contains (Swift) kimi təhlükəsiz metodlardan istifadə bu tip kritik səhvlərin qarşısını alır.

Resursla bağlı crash-lər

Yaddaşın çatışmaması (OutOfMemoryError), yığının daşması (StackOverflowError), mövcud olmayan resursun yüklənməsi — resurs səhvləri çox vaxt kritikdir və çətin təkrarlanır. OutOfMemoryError böyük şəkillərin sıxışdırılmadan yüklənməsi və ya boşaldılmayan istinadlar səbəbindən yaddaş sızıntısı zamanı baş verir. StackOverflowError — əsas halı olmayan dərin rekursiya və ya deleqatlar zəncirində tsiklik çağırışlar zamanı yaranır.

Concurrency səhvləri

Deadlock, race condition, iterasiya zamanı kolleksiyanın dəyişdirilməsi — çoxaxın səhvləri qeyri-deterministik şəkildə özünü göstərir və diaqnoz üçün ən çətindir. Android-də müxtəlif axınlardan ArrayList-in dəyişdirilməsi zamanı ConcurrentModificationException, iOS-da sinxronizasiyasız NSMutableArray-in dəyişdirilməsi səbəbindən crash baş verir. Kotlin korutinləri (structured concurrency) və ya Swift Actors (iOS 16+) concurrency crash-lərinin ehtimalını azaldır.

Fatal Error vs Non-Fatal Error

Əsas fərq — bərpa olunma imkanı. Non-Fatal Error proqramın işə davam etməsinə imkan verir: şəbəkə timeout-u try-catch ilə idarə olunur, pars xətası standart dəyərlə əvəz olunur. Fatal Error-un belə bir yolu yoxdur — crash qaçınılmazdır və tətbiq yenidən başladılmalıdır. Bu səhv növləri arasındakı sərhəd tətbiqin arxitekturası ilə müyən edilir.

XüsusiyyətFatal ErrorNon-Fatal Error
Tətbiqin dayandırılmasıBəliXeyr
BərpaMümkün deyilcatch bloku vasitəsilə mümkündür
Məlumat toplanmasıYalnız crash-reporterKoddan jurnallaşdırma
UX zərəriSeansın tam pozulmasıMüvəqqəti narahatlıq
Tipik nümunəNullPointerExceptionIOException

Eyni səhv bir platformada fatal, digərində isə non-fatal ola bilər. Sıfıra bölmə Java/Kotlin-də ArithmeticException atır (kritik deyil — tutula bilər), Swift-də isə fatal error: Division by zero (tutulması mümkün olmayan crash) yaradır. Tərtibatçı səhv idarəetməsini layihələndirərkən müəyyən dilin və icra mühitinin davranışını nəzərə almalıdır. Fatal və non-fatal arasındakı sərhədin başa düşülməsi etibarlı mobil tətbiq arxitekturasının qurulmasının əsasıdır.

Kritik səhvlərin diaqnostikası

Firebase Crashlytics — mobil tətbiqlərdə crash-lərin diaqnostikası üçün de-fakto standartdır. SDK avtomatik olaraq stack trace, cihaz vəziyyəti, əməliyyat sistemi versiyası və crash-dan əvvəlki jurnalları toplayır. Dashboard eyni crash-ləri bir issue-də qruplaşdırır, təsirlənmiş istifadəçilərin sayını, təkrarlanma tezliyini və crash-in baş verdiyi tətbiq versiyasını göstərir.

kotlin
// Android tətbiqində Crashlytics-in işə salınması
class MainApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        FirebaseApp.initializeApp(this)
        Crashlytics.setCustomKey("build_type", "production")
    }
}

// Crash diaqnostikası üçün fərdi məlumatların təyin edilməsi
Crashlytics.setUserId("user_12345")
Crashlytics.setCustomKey("screen", "ProfileFragment")
Crashlytics.setCustomKey("api_response", responseCode)

// inteqrasiyanın test edilməsi üçün məcburi crash
Crashlytics.crash()

Sentry — daha ətraflı diaqnostika ilə alternativ həll. Sentry təkcə stack trace deyil, həm də bütün dəyişənlərin vəziyyətini, səhvə qədərki hadisələrin ardıcıllığını və icra kontekstini göstərir. Sentry-dəki Breadcrumbs kritik səhvdən əvvəl istifadəçinin hərəkətlər zəncirini bərpa etməyə imkan verir: dümə klikləri, ekranlar arası keçidlər, şəbəkə sorğuları. Sentry-də keyfiyyətin kompleks təhlili üçün performans və sessiyaların monitorinqi mövcuddur.

Symbolizasiya və deobfuskasiya

iOS-da crash-lərin düzgün diaqnostikası üçün Crashlytics və ya Sentry-də dSYM fayllarının (debug symbols) yüklənməsi tələb olunur. dSYM olmadan stack trace funksiya adları əvəzinə yalnız yaddaş ünvanlarını ehtiva edəcək. Android üçün ProGuard və ya R8 istifadə edərkən mapping fayllarının yüklənməsi tələb olunur. Xcode-da build phase və ya Gradle plagin vasitəsilə dSYM yüklənməsinin avtomatlaşdırılması istehsalat qurğuları üçün məcburidir.

Kritik səhvlərin qarşısının alınması

Əsas qarşısını alma metodu — bütün optional və nullable dəyərlərin safe unwrapping-i. Swift-də if-let və Kotlin-də ?: ilə let istifadəsi null-pointer səhvlərini aradan qaldırır. Dəyərin mövcudluğuna zəmanət olmadan heç bir force unwrap. Həm Kotlin, həm də Swift kompilyatorları potensial təhlükəli əməliyyatlar barədə xəbərdarlıq edir — istehsalat kodunda bu xəbərdarlıqlara məhəl qoymaq olmaz.

swift
// Safe unwrapping vasitəsilə fatal error-un QARŞISININ ALINMASI
func processUser(id: String) -> String {
    guard let user = database.findUser(by: id) else {
        return "User not found"
    }
    guard let email = user.email else {
        return "Email not set"
    }
    return email
}

// Kolleksiya elementlərinə təhlükəsiz müraciət
func safeGet <T>(items: [T], index: Int) -> T? {
    guard items.indices.contains(index) else { return nil }
    return items[index]
}

// Müraciətdən əvvəl massiv sərhədlərinin yoxlanması
let numbers = [1, 2, 3]
if numbers.indices.contains(5) {
    print(numbers[5])
} else {
    print("Index out of range")
}

Defensive programming — ikinci müdafiə səviyyəsi. Həmişə funksiyaların giriş parametrlərini yoxlayın, force unwrap əvəzinə Optional və ya Result qaytarın, inkişaf mərhələsində səhvlərin erkən aşkarlanması üçün debug qurğularında assert istifadə edin. Sərhəd halları (null, boş kolleksiyalar, səhv indekslər) üçün vahid testlər tətbiqin biznes məntiqinin bütün açıq giriş nöqtələrini əhatə etməlidir.

UI təbəqəsi üçün Error Boundary

React Native və SwiftUI-də error boundary təyin etmək olar — render zamanı kritik səhvləri tutan və crash əvəzinə ehtiyat interfeys göstərən komponent. Bu, istifadəçi təcrübəsi baxımından kritik UI səhvini non-fatal-a çevirir — tətbiq işləməyə davam edir və istifadəçi ağ ekran əvəzinə interfeysin konkret blokunda səhv mesajı görür.

CI/CD-də crash yoxlamaları

CI/CD pipeline-ında avtomatik yoxlamaların inteqrasiyası: statik təhlil (Kotlin üçün Detekt, Swift üçün SwiftLint), real cihazlarda UI testlərinin işə salınması, test mühitində crash-free rate-in yoxlanması. Crash-rate həddini aşdıqda merg-in bloklanması (tövsiyə olunan hədd — commit başına 0.1%-dən çox yeni crash).

Tez-tez verilən suallar

Fatal error-dan sonra bərpa olunmaq mümkündürmü?

Xeyr, fatal error-dan sonra bərpa mümkün deyil — proses ƏS səviyyəsində dayandırılır. Yeganə yol — kritik səhvin baş verməsinin qarşısını təhlükəsiz konstruksiyalar, defensive programming və inkişaf mərhələsində sərhəd hallarının hərtərəfli test edilməsi ilə almaqdır.

Fatal error segfault-dan nə ilə fərqlənir?

Segfault (SIGSEGV) — yaddaşın qadağan olunmuş sahəsinə müraciət zamanı yaranan fatal error növlərindən biridir. FATAL ERROR — segfault, abort, stack overflow, out of memory və icra mühitində idarə olunmayan istisnalar daxil olmaqla bütün bərpa olunmayan səhvlər üçün ümumi anlayışdır.

Istehsalatda fatal error-u avtomatik necə toplamaq olar?

Crashlytics (Firebase) və ya Sentry SDK-nın inteqrasiyası bütün idarə olunmayan istisnaları avtomatik toplayır. SDK ƏS siqnallarını və icra mühiti istisnalarını tutur, stack trace və kontekstlə crash hesabatı yaradır və tətbiqin növbəti başladılmasında serverə göndərir.

Fatal error ilə ssenariləri necə test etməli?

Crash-lərin idarə edilməsinin test edilməsi üçün debug qurğusunda force crash istifadə olunur. Crashlytics kritik səhvi simulyasiya etmək üçün crash() metodu təqdim edir. Vahid testlərdə guard və if-let-in düzgünlüyü yoxlanılır, UI testləri isə daxiletmə və interfeys vəziyyətlərinin sərhəd hallarını əhatə edir.

Mobil tətbiqlərdə bütün istisnalar fataldırmı?

Xeyr, yalnız idarə olunmayan istisnalar fatal olur. Try-catch ilə tutulan istisna non-fataldır. İdarə olunan və idarə olunmayan istisna arasındakı fərq tətbiqin bağlanıb-bağlanmayacağını və ya istifadəçi təcrübəsinə minimal zərərlə alternativ vəziyyətdə işləməyə davam edəcəyini müyən edir.

Xülasə

  • Fatal Error — crash və tətbiq prosesinin dayandırılmasına səbəb olan bərpa olunmaz səhv
  • Null-pointer — kritik səhvlərin əsas səbəbi (JetBrains məlumatlarına görə bütün istehsalat crash-lərinin 28%-i)
  • Non-Fatal Error — tətbiqi dayandırmayan idarə olunan istisna (şəbəkə timeout-u, parse xətası)
  • Crashlytics — mobil tətbiqlərdə crash-lərin avtomatik toplanması və təhlili üçün əsas alət
  • Safe unwrapping — Swift və Kotlin-də kritik səhvlərin qarşısının alınmasının əsas metodu
  • Defensive programming — giriş parametrlərinin, indekslərin və sərhəd vəziyyətlərinin yoxlanması
  • Error Boundary — kritik UI səhvini istifadəçi üçün non-fatal-a çevirən komponent

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.

Layihəni müzakirə et

Həm də oxuyun