Non-Fatal Error — ay isang error na hindi humahantong sa pagtatapos ng aplikasyon at nagpapahintulot na ipagpatuloy ang pagpapatakbo ng programa. Hindi tulad ng fatal error, ang mga non-fatal na error ay maaaring mahuli, mapangasiwaan at mai-log nang hindi nawawala ang session ng gumagamit. Ayon sa Firebase Crashlytics Documentation, 2024, humigit-kumulang 70% ng lahat ng naitalang error sa mga production application ay non-fatal, ngunit ang pagbalewala sa mga ito ay humahantong sa akumulasyon ng teknikal na utang at unti-unting pagkasira ng karanasan ng gumagamit. Ang tamang paghawak ng mga non-fatal error ay isa sa mga pangunahing kasanayan ng isang mobile developer.
Mga Pangunahing Punto
Non-Fatal Error — ay isang exception o maling estado na hindi nagiging sanhi ng pagtatapos ng proseso. Ang aplikasyon ay patuloy na gumagana, ngunit maaaring nasa maling estado: hindi na-load ang data, hindi naipadala ang kahilingan, hindi naipakita ang elemento ng interface. Ang gumagamit ay maaaring hindi mapansin ang error o makakita ng mensahe at magpatuloy sa paggamit ng aplikasyon.
Ang non-fatal na error ay laging nag-iiwan sa programa ng landas para sa pagpapanumbalik. Ang tagapangasiwa ng error ay maaaring mag-alok ng alternatibong data, ulitin ang operasyon o magpakita ng placeholder ng interface. Ang pangunahing gawain ay pigilan ang crash at mapanatili ang karanasan ng gumagamit sa isang katanggap-tanggap na antas. Dapat tahasang isaalang-alang ng developer ang senaryo ng pagpapanumbalik sa bawat bloke ng catch.
Ayon sa datos ng Instabug 2024, 65% ng mga gumagamit ay nagtatanggal ng aplikasyon pagkatapos ng dalawang nabigong interaksyon. Ang mga non-fatal na error na hindi pinapansin ay naiipon at nagpapababa ng pangkalahatang kalidad ng trabaho. Ang sistematikong pag-log at pag-aayos ng mga non-fatal na error ay direktang daan upang mapataas ang retention at mapabuti ang mga rating ng gumagamit sa mga tindahan ng aplikasyon.
Mga Error sa Network — ang pinakakaraniwang uri ng non-fatal na error sa mga mobile application. Timeout ng koneksyon, pagkawala ng network, maling code ng status ng server — lahat ng sitwasyong ito ay nahuhuli at napangasiwaan nang walang crash. Ipinapakita sa gumagamit ang mensahe tungkol sa hindi pagkakaroon ng serbisyo na may mungkahing subukan muli. Para sa mga error sa network, tipikal ang pattern ng retry na may exponential delay.
Maling format ng tugon ng server, kawalan ng mandatoryong field, maling uri ng data — mga error sa parsing ay non-fatal kung ang aplikasyon ay wastong humahawak ng maling data. Ang tipikal na diskarte ay paggamit ng mga default na halaga ng backup at pag-log ng error sa parsing na may konteksto ng kahilingan para sa susunod na pagsusuri sa server.
Mga problema sa pag-load ng mga imahe, maling mga font, error sa layout — lahat ng ito ay hindi fatal ngunit pinapahina ang impresyon ng gumagamit. Mga placeholder na imahe at fallback na halaga ay pumipigil sa mga blangkong screen at ginagawang hindi gaanong kapansin-pansin ang mga error. Sa React Native para sa mga error sa UI ay ginagamit ang Error Boundary na may pagpapakita ng bahaging pamalit.
Mga error sa pagkalkula, hindi pagkakatugma ng estado, maling paglipat sa pagitan ng mga screen — mga lohikal na error ay kadalasang hindi humahantong sa crash, ngunit humahantong sa maling pag-uugali ng aplikasyon. Mas mahirap silang matukoy nang walang sistematikong pag-log at pagsubaybay dahil hindi sila lumilikha ng ulat ng crash at nananatiling hindi napapansin hanggang sa reklamo ng gumagamit.
Non-Fatal Error ay naiiba mula sa fatal dahil iniiwan nito sa programa ang kakayahang magpatuloy sa trabaho. Fatal error — ay isang estado kung saan hindi makakabawi ang aplikasyon: dereferensya ng null pointer, stack overflow, kakulangan ng memorya. Ang non-fatal na error ay maaaring mahuli, mapangasiwaan at ipagpatuloy ang pagpapatakbo, habang ang fatal error ay nangangailangan ng pag-restart ng aplikasyon.
| Katangian | Non-Fatal Error | Fatal Error |
|---|---|---|
| Pagtatapos ng Aplikasyon | Hindi | Oo |
| Posibilidad ng Pagpapanumbalik | Oo, sa pamamagitan ng catch block | Hindi |
| Pag-log | Mula sa kodigo sa pamamagitan ng recordException | Tanging ng crash reporter |
| Epekto sa UX | Pansamantalang abala | Ganap na pagkawala ng session |
| Halimbawa | Network timeout, parse error | NullPointerException, OOM |
Ang hangganan sa pagitan ng non-fatal at fatal ay maaaring depende sa implementasyon. Ang network timeout sa isang aplikasyon ay pinangangasiwaan bilang non-fatal (pag-uulit ng kahilingan pagkatapos ng 1–2 segundo), sa iba ay maaaring fatal (crash kung walang tagapangasiwa). Ang de-kalidad na paghawak ng error ay ginagawang non-fatal ang mga potensyal na fatal na sitwasyon, pinapataas ang katatagan ng aplikasyon. Ang pagdisenyo ng sistema ng paghawak ng error ay isa sa mga pangunahing gawaing arkitektural sa pagbuo ng mobile application na may mataas na pangangailangan sa pagiging maaasahan. Ang built-in na sistema ng pagsubaybay ay nagpapahintulot sa koponan na mabilis na matukoy at maayos ang mga non-fatal na error bago makaapekto ang mga ito sa malaking bilang ng mga gumagamit.
Firebase Crashlytics — ang pangunahing kasangkapan para sa pag-log ng mga non-fatal na error sa mga mobile application. Ang pamamaraang recordException ay nagpapahintulot na itala ang non-fatal na exception na may kumpletong stack trace at konteksto ng pagpapatakbo nang hindi naaabala ang trabaho ng aplikasyon. Hindi tulad ng mga ulat ng crash, ang recordException ay maaaring tawagan sa anumang bahagi ng kodigo para sa pag-log ng mga nahuling exception.
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: gumagamit ng backup na data
Crashlytics.recordException(e)
showFallbackContent()
}
}
// Pag-log gamit ang mga susi ng gumagamit
Crashlytics.setCustomKey("screen", "Profile")
Crashlytics.setCustomKey("api_version", "v3")
Sentry — alternatibo sa Crashlytics na may mas detalyadong diagnostiko ng mga non-fatal na error. Ang Sentry SDK ay nagbibigay ng pamamaraang captureException, na nagpapadala ng mga detalye ng exception sa server. Ang pangunahing bentahe ng Sentry ay ang pagpapangkat ng mga katulad na non-fatal na error sa iisang issue, pagsusuri ng dalas ng pag-uulit at konteksto ng pagpapatakbo sa anyo ng breadcrumbs — pagkakasunod-sunod ng mga aksyon ng gumagamit bago ang error.
Hindi lahat ng non-fatal na error ay kailangang i-log. Mga inaasahang estado — pagkabigo ng network kapag walang koneksyon — ay maaaring i-log nang pili. Mga hindi inaasahang error — NullPointerException sa pinangasiwaang kodigo, maling format ng data, logic error — ay dapat palaging i-log. Ang bawat koponan ay tumutukoy sa antas ng kahalagahan: sa karaniwan, 10 hanggang 20 natatanging non-fatal na error bawat 1000 gumagamit bawat araw ay itinuturing na normal. Mahalagang mag-set up ng mga alerto sa biglaang pagtaas ng bilang ng mga non-fatal na error — ito ay maaaring magpahiwatig ng mga problema sa bagong bersyon ng API o regression pagkatapos ng release.
Ang pangunahing mekanismo ng pangangasiwa — try-catch, na pumupukaw ng exception at nagpapatupad ng kodigo ng pagpapanumbalik. Para sa mga operasyon sa network, ang tipikal na pattern ay pag-uulit ng kahilingan na may exponential delay (retry with backoff). Para sa mga error sa parsing — paggamit ng mga default na halaga ng backup at pag-log ng konteksto para sa susunod na pagsusuri sa panig ng server.
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)
}
Mga Uri ng Result — alternatibong diskarte nang walang exception. Ang function ay nagbabalik ng sealed class Result na may mga variant na Success at Failure. Ang tumatawag na kodigo ay tahasang humahawak sa parehong variant, na nag-aalis ng mga hindi napangasiwaang error. Ang mga uri ng Result ay sikat sa Kotlin (Result
Para sa bawat uri ng non-fatal na error ay kailangang maglaan ng istratehiya ng pagpapanumbalik: pag-load ng naka-cache na data sa error sa network, paggamit ng mga default na halaga sa error sa parsing, muling pagsisimula ng bahagi sa error sa UI. Ang mabuting kasanayan ay magpakita ng toast o snackbar na may mensahe ng error sa gumagamit, ngunit hindi ganap na harangan ang interaksyon sa aplikasyon. Mahalagang pag-ibahin ang mga error na maaaring maibalik (recoverable) at hindi maaaring maibalik — para sa huli ang istratehiya ng pagpapanumbalik ay magkakaiba, halimbawa, mungkahing i-restart ang screen o linisin ang data. Ang pag-cache ng nakaraang matagumpay na estado ay kadalasang pinakasimple at pinakamabisang paraan ng pangangasiwa ng mga non-fatal na error sa mga mobile platform.
Mga Madalas Itanong
Warning — ay babala ng compiler o static analyzer tungkol sa potensyal na problema sa kodigo. Non-fatal error — ay isang runtime exception na naganap na ngunit hindi humantong sa crash. Ang warning ay maaaring alisin bago ang compilation, ang non-fatal error — ay maaaring pangasiwaan sa panahon ng pagpapatakbo sa pamamagitan ng catch block.
Hindi, ang labis na pag-log ay bumabara sa pagsubaybay. Mas mainam na i-log ang mga hindi inaasahang error sa production at balewalain ang mga inaasahang estado: ang pagkabigo ng network kapag walang koneksyon ay ini-log nang pili, habang ang NullPointerException sa pinangasiwaang kodigo — palagi. Ang bawat koponan ay tumutukoy sa antas ng kahalagahan batay sa konteksto ng aplikasyon.
Sa SwiftUI ay ginagamit ang ObservableObject na may @Published na field na errorState para subaybayan ang estado ng error. Ang View ay nag-subscribe sa mga pagbabago at nagpapakita ng alternatibong nilalaman. Bago ang iOS 17 ay ginamit ang Combine na may mga tagapangasiwa, simula sa iOS 17 — SwiftData at @Observable macro para sa reaktibong pag-update ng UI.
Oo, kung ang error ay magdudulot ng chain reaction. Halimbawa: ang non-fatal na pagkabigo sa pag-load ng imahe ay maaaring humantong sa maling estado ng UI, na pagkatapos ay magdudulot ng crash sa pagtatangkang magpakita. Ang de-kalidad na pangangasiwa ng mga non-fatal na error sa bawat antas ay pumipigil sa kanilang pag-akyat sa fatal na antas.
Sa iOS, ang mga non-fatal na error ay pinangangasiwaan sa pamamagitan ng do-catch na may throw, sa Android — sa pamamagitan ng try-catch na may exceptions. Ang iOS ay gumagamit ng NSError na may mga domain at code ng error, ang Android — Java/Kotlin exceptions. Ang Crashlytics ay gumagana nang pareho sa parehong platform sa pamamagitan ng recordException, na nagbibigay ng pinag-isang interface para sa pagsubaybay.
Buod
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.
Basahin din