Fatal Error: ano ito, pangunahing sanhi at paraan ng pag-iwas

May-akda: IT Sectr Nai-publish: 2026-05-27 Oras ng pagbabasa: 8 min

Fatal Error — ito ay isang kritikal na error na nagdudulot ng agarang paghinto ng aplikasyon (crash). Hindi tulad ng non-fatal error, ang fatal error ay hindi nag-iiwan ng pagkakataon para sa pagbawi — ang proseso ay sapilitang tinatapos ng operating system o runtime environment. Ayon sa data ng Firebase Crashlytics 2024, ang karaniwang app ay nawawalan ng 2.5% ng mga gumagamit pagkatapos ng bawat crash, at ang pag-aalis ng mga fatal error ay priyoridad numero uno sa mobile development. Kung mas mataas ang crash-free rate, mas mataas ang rating ng app sa mga tindahan at mas kaunti ang pag-agos ng mga gumagamit.

Pangunahing Punto

  • Fatal Error — kritikal na error na nagdudulot ng agarang crash ng app
  • Null-pointer — pinakakaraniwang sanhi ng fatal error sa mga mobile app
  • Non-Fatal Error — alternatibong uri ng error na hindi tinatapos ang app
  • Crashlytics at Sentry awtomatikong nangongolekta ng stack trace ng fatal error
  • Pag-iwas sa fatal error ay may kasamang safe unwrapping, defensive programming at pagsubok

Ano ang Fatal Error

Fatal Error — ay isang error kung saan hindi posible ang karagdagang pagpapatakbo ng programa. Tinatapos ng operating system o virtual machine ang proseso upang maiwasan ang pagkasira ng data. Sa iOS ang fatal error ay nagdudulot ng signal na SIGABRT o SIGSEGV, sa Android — isang hindi naka-handle na exception na umabot sa root handler at tinatapos ang proseso. Agad na nagsasara ang app, bumalik ang gumagamit sa home screen.

Mga palatandaan ng fatal error

Mga katangiang palatandaan ng fatal error: ulat ng crash na may kumpletong stack trace, hindi inaasahang pagkawala ng app, tala ng pagtatapos ng proseso sa system log, itim o puting screen bago ang pagsasara. Nakikita ng gumagamit ang home screen nang walang posibilidad na ibalik ang session — ang app ay kailangang simulan muli mula sa zero state. Sa iOS ang crash ay sinamahan ng pagsulat sa .crash file na naa-access sa pamamagitan ng Xcode Organizer.

Epekto sa mga sukatan ng negosyo

Ang bawat crash ay negatibong nakakaapekto sa pagpapanatili ng gumagamit. Ayon sa Google Play Console 2024, ang mga app na may crash-free rate na mas mababa sa 99.5% ay tumatanggap ng mas mababang rating sa paghahanap at mga rekomendasyon. Ang crash-rate ay isa sa mga pangunahing senyales ng kalidad para sa App Store at Google Play — ang mataas na antas ng fatal error ay maaaring harangan ang pag-publish ng mga update. Para sa mga app sa pananalapi at medikal, ang crash-free rate na mas mababa sa 99.9% ay itinuturing na hindi katanggap-tanggap.

Mga sanhi ng fatal error

Null-pointer dereference — pangunahing sanhi ng fatal error sa mga mobile app. Ang pagtatangkang ma-access ang property o method ng isang bagay na null ay nagdudulot ng NullPointerException sa Android o EXC_BAD_ACCESS sa iOS. Ayon sa JetBrains 2023, humigit-kumulang 28% ng lahat ng production crash ay nauugnay sa null-pointer. Sa Kotlin, ang null-safety system ay makabuluhang nagbabawas ng porsyentong ito, ngunit ang force unwrap at Java compatibility ay nananatiling pinagmumulan ng problema.

Index-out-of-bounds

Pag-access sa elemento ng koleksyon sa pamamagitan ng hindi umiiral na index — pangalawang pinakakaraniwang sanhi ng crash. Sa Java at Kotlin ito ay ArrayIndexOutOfBoundsException, sa Swift — fatal error: Index out of range. Kadalasang nangyayari kapag nagtatrabaho sa mga listahan pagkatapos ng pag-filter o dynamic na pagbabago ng laki ng koleksyon. Ang paggamit ng mga ligtas na pamamaraan getOrNull (Kotlin) o indices.contains (Swift) ay pumipigil sa ganitong uri ng fatal error.

Crash na may kaugnayan sa resource

Kakulangan ng memorya (OutOfMemoryError), stack overflow (StackOverflowError), pag-load ng hindi umiiral na resource — mga error sa resource ay kadalasang fatal at mahirap i-reproduce. Ang OutOfMemoryError ay nangyayari kapag nag-load ng malalaking larawan nang walang compression o pagtagas ng memorya dahil sa hindi nailabas na mga reference. StackOverflowError — sa malalim na recursion nang walang base case o cyclically na tawag sa chain ng delegado.

Concurrency error

Deadlock, race condition, pagbabago ng koleksyon sa panahon ng iteration — multithreading error ay nagpapakita ng hindi deterministiko at pinakamahirap na i-diagnose. Sa Android ConcurrentModificationException kapag binabago ang ArrayList mula sa iba't ibang thread, sa iOS crash dahil sa pagbabago ng NSMutableArray nang walang synchronization. Ang paggamit ng Kotlin coroutine (structured concurrency) o Swift Actors (iOS 16+) ay nagbabawas ng posibilidad ng concurrency crash.

Fatal Error vs Non-Fatal Error

Ang pangunahing pagkakaiba — kakayahang bumawi. Non-Fatal Error ay nagpapahintulot sa programa na magpatuloy: ang network timeout ay hinahawakan ng try-catch, ang error sa parsing ay pinapalitan ng default na halaga. Ang Fatal Error ay walang ganoong landas — ang crash ay hindi maiiwasan at ang app ay dapat na simulan muli. Ang hangganan sa pagitan ng mga uri ng error na ito ay tinutukoy ng arkitektura ng app.

KatangianFatal ErrorNon-Fatal Error
Pagtatapos ng appOoHindi
PagbawiHindi posiblePosible sa pamamagitan ng catch block
Pagkolekta ng impormasyonCrash-reporter langPag-log mula sa code
Pinsala sa UXKabuuang pagkabigo ng sessionPansamantalang abala
Karaniwang halimbawaNullPointerExceptionIOException

Ang parehong error ay maaaring fatal sa isang platform at non-fatal sa iba pa. Paghati sa zero sa Java/Kotlin ay nagtatapon ng ArithmeticException (hindi fatal — maaaring mahuli), sa Swift ay nagdudulot ng fatal error: Division by zero (crash na walang posibilidad na mahuli). Dapat isaalang-alang ng developer ang pag-uugali ng partikular na wika at runtime environment kapag nagdidisenyo ng paghawak ng error. Ang pag-unawa sa hangganan sa pagitan ng fatal at non-fatal — batayan ng pagbuo ng fault-tolerant na arkitektura ng mobile app.

Pagsusuri ng fatal error

Firebase Crashlytics — de facto na pamantayan para sa pagsusuri ng crash sa mga mobile app. Ang SDK ay awtomatikong nangongolekta ng stack trace, estado ng device, bersyon ng OS at mga log bago ang crash. Pinapangkat ng dashboard ang magkaparehong crash sa isang issue, na nagpapakita ng bilang ng mga apektadong gumagamit, dalas ng pag-ulit at bersyon ng app kung saan naganap ang crash.

kotlin
// Pagsisimula ng Crashlytics sa Android app
class MainApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        FirebaseApp.initializeApp(this)
        Crashlytics.setCustomKey("build_type", "production")
    }
}

// Pagtatakda ng custom na data para sa diagnosis ng crash
Crashlytics.setUserId("user_12345")
Crashlytics.setCustomKey("screen", "ProfileFragment")
Crashlytics.setCustomKey("api_response", responseCode)

// Sapilitang crash para sa pagsubok ng integrasyon
Crashlytics.crash()

Sentry — alternatibo na may mas detalyadong pagsusuri. Ipinapakita ng Sentry hindi lamang ang stack trace, kundi pati na rin ang estado ng lahat ng variable, pagkakasunod-sunod ng mga kaganapan hanggang sa error at konteksto ng pagpapatupad. Ang Breadcrumbs ng Sentry ay nagpapahintulot sa muling pagbuo ng chain ng mga aksyon ng gumagamit bago ang fatal error: pagpindot ng pindutan, paglipat sa pagitan ng mga screen, mga kahilingan sa network. Sa Sentry, available ang pagsubaybay sa pagganap at session para sa komprehensibong pagsusuri ng kalidad.

Symbolication at deobfuscation

Para sa tamang pagsusuri ng crash sa iOS kinakailangan ang pag-load ng mga file ng dSYM (debug symbols) sa Crashlytics o Sentry. Kung walang dSYM, ang stack trace ay maglalaman lamang ng mga memory address sa halip na mga pangalan ng function. Para sa Android kinakailangan ang pag-load ng mga mapping file kapag gumagamit ng ProGuard o R8. Ang awtomatikong pag-load ng dSYM sa pamamagitan ng build phase sa Xcode o Gradle plugin ay sapilitan para sa production build.

Pag-iwas sa fatal error

Ang pangunahing paraan ng pag-iwas — safe unwrapping ng lahat ng opsyonal at nullable na halaga. Ang paggamit ng if-let sa Swift at let na may ?: sa Kotlin ay nag-aalis ng null-pointer error. Walang force unwrap nang walang garantiya ng pagkakaroon ng halaga. Parehong nagbabala ang Kotlin at Swift compiler tungkol sa mga potensyal na mapanganib na operasyon — ang mga babalang ito ay hindi maaaring balewalain sa production code.

swift
// Pag-iwas sa fatal error sa pamamagitan ng safe unwrapping
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
}

// Ligtas na pag-access sa mga elemento ng koleksyon
func safeGet <T>(items: [T], index: Int) -> T? {
    guard items.indices.contains(index) else { return nil }
    return items[index]
}

// Pagsusuri ng hangganan ng array bago ang pag-access
let numbers = [1, 2, 3]
if numbers.indices.contains(5) {
    print(numbers[5])
} else {
    print("Index out of range")
}

Defensive programming — pangalawang antas ng proteksyon. Palaging suriin ang mga parameter ng input ng function, ibalik ang Optional o Result sa halip na force unwrap, gumamit ng assert sa debug build para sa maagang pagtuklas ng error sa yugto ng pag-unlad. Unit test para sa mga hangganan na kaso (null, walang laman na koleksyon, maling index) ay dapat sumaklaw sa lahat ng pampublikong entry point ng business logic ng app.

Error Boundary para sa UI layer

Sa React Native at SwiftUI ay maaaring itakda ang error boundary — isang component na kumukuha ng fatal rendering error at nagpapakita ng fallback UI sa halip na crash. Ito ay ginagawang non-fatal ang fatal UI error mula sa pananaw ng karanasan ng gumagamit — ang app ay patuloy na gumagana at nakikita ng gumagamit ang mensahe ng error sa isang partikular na bloke ng interface, hindi isang puting screen.

Pagsusuri ng crash sa CI/CD

Pagsasama ng awtomatikong pagsusuri sa CI/CD pipeline: static analysis (Detekt para sa Kotlin, SwiftLint para sa Swift), pagpapatakbo ng UI test sa totoong device, pagsusuri ng crash-free rate sa test environment. Pag-block ng merge kapag lumampas sa threshold ng crash-rate (inirekomendang threshold — higit sa 0.1% bagong crash bawat commit).

Mga Madalas Itanong

Maaari bang gumaling pagkatapos ng fatal error?

Hindi, pagkatapos ng fatal error ang pagbawi ay hindi posible — ang proseso ay tinatapos sa antas ng operating system. Ang tanging paraan — maiwasan ang fatal error bago ito mangyari sa pamamagitan ng ligtas na konstruksyon, defensive programming at komprehensibong pagsubok ng mga hangganan na kaso sa yugto ng pag-unlad.

Ano ang pagkakaiba ng fatal error sa segfault?

Segfault (SIGSEGV) — isa sa mga uri ng fatal error na nangyayari kapag ina-access ang hindi pinapayagang memory area. FATAL ERROR — pangkalahatang konsepto para sa lahat ng hindi na mababawi na error, kabilang ang segfault, abort, stack overflow, out of memory at hindi naka-handle na exception sa runtime.

Paano awtomatikong mangolekta ng fatal error sa production?

Ang pagsasama ng Crashlytics (Firebase) o Sentry SDK ay awtomatikong nangongolekta ng lahat ng hindi naka-handle na exception. Ang SDK ay humaharang ng signal ng OS at runtime exception, bumubuo ng crash report na may stack trace at konteksto at ipinapadala ito sa server sa susunod na paglunsad ng app.

Paano subukan ang mga senaryo na may fatal error?

Para sa pagsubok sa paghawak ng crash ay ginagamit ang force crash sa debug build. Ang Crashlytics ay nagbibigay ng method na crash() para sa simulation ng fatal error. Sa unit test, sinusuri ang kawastuhan ng guard at if-let, at ang UI test ay sumasaklaw sa mga hangganan na kaso ng input ng data at estado ng interface.

Lahat ba ng exception ay fatal sa mobile app?

Hindi, tanging ang hindi naka-handle na exception ang nagiging fatal. Ang exception na nahuli ng try-catch ay non-fatal. Ang pagkakaiba sa pagitan ng naka-handle at hindi naka-handle na exception ay tumutukoy kung ang app ay magsasara o magpapatuloy sa paggana sa alternatibong estado na may minimal na pinsala sa karanasan ng gumagamit.

Buod

  • Fatal Error — hindi na mababawi na error na nagdudulot ng crash at pagtatapos ng proseso ng app
  • Null-pointer — pangunahing sanhi ng fatal error (28% ng lahat ng production crash ayon sa JetBrains)
  • Non-Fatal Error — naka-handle na exception na hindi tinatapos ang app (network timeout, error sa parsing)
  • Crashlytics — pangunahing tool para sa awtomatikong pagkolekta at pagsusuri ng crash sa mobile app
  • Safe unwrapping — pangunahing paraan ng pag-iwas ng fatal error sa Swift at Kotlin
  • Defensive programming — pagsusuri ng input parameter, index at hangganan na estado
  • Error Boundary — component na ginagawang non-fatal ang fatal UI error para sa gumagamit

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din