Non-Fatal Error — olyan hiba, amely nem vezet az alkalmazás működésének befejezéséhez, és lehetővé teszi a program végrehajtásának folytatását. A fatal errortól eltérően a nem végzetes hibák elkaphatók, kezelhetők és naplózhatók a felhasználói munkamenet elvesztése nélkül. A Firebase Crashlytics Documentation, 2024 adatai szerint a termelési alkalmazásokban regisztrált összes hiba körülbelül 70%-a nem végzetes, de figyelmen kívül hagyásuk a technikai adósság felhalmozódásához és a felhasználói élmény fokozatos romlásához vezet. A non-fatal hibák helyes kezelése a mobilfejlesztő egyik kulcsfontosságú készsége.
Főbb pontok
Non-Fatal Error — olyan kivétel vagy hibás állapot, amely nem okozza a folyamat megszakítását. Az alkalmazás tovább működik, de hibás állapotban lehet: az adatok nem töltődtek be, a kérés nem küldődött el, a felületi elem nem jelent meg. A felhasználó vagy nem veszi észre a hibát, vagy lát egy üzenetet és folytatja az alkalmazás használatát.
A nem végzetes hiba mindig hagy a programnak helyreállítási utat. A hibakezelő alternatív adatokat kínálhat, megismételheti a műveletet, vagy megjeleníthet egy felületi helyőrzőt. A fő feladat megakadályozni az összeomlást és a felhasználói élményt elfogadható szinten tartani. A fejlesztőnek minden catch blokkban kifejezetten elő kell látnia egy helyreállítási forgatókönyvet.
Az Instabug 2024 adatai szerint a felhasználók 65%-a törli az alkalmazást két sikertelen interakció után. A figyelmen kívül hagyott non-fatal hibák felhalmozódnak és csökkentik az általános működési minőséget. A nem végzetes hibák szisztematikus naplózása és javítása közvetlen út a megtartás növeléséhez és a felhasználói értékelések javításához az alkalmazásboltokban.
Hálózati hibák — a non-fatal hibák leggyakoribb típusa mobilalkalmazásokban. Kapcsolódási időtúllépés, hálózat elvesztése, hibás szerver állapotkód — ezek a helyzetek mind elkaphatók és kezelhetők összeomlás nélkül. A felhasználó számára üzenet jelenik meg a szolgáltatás elérhetetlenségéről, újrapróbálkozási javaslattal. A hálózati hibákra jellemző az exponenciális késleltetésű újrapróbálkozási minta (retry).
Hibás szerverválasz formátum, kötelező mező hiánya, hibás adattípus — elemzési hibák nem végzetesek, ha az alkalmazás helyesen kezeli a hibás adatokat. A tipikus megközelítés az alapértelmezett tartalékértékek használata és az elemzési hiba naplózása a kérés kontextusával a későbbi szerveroldali elemzéshez.
Problémák a képek betöltésével, hibás betűtípusok, layout-hibák — ezek egyike sem végzetes, de rontja a felhasználói élményt. Helyőrző képek és fallback értékek segítenek elkerülni az üres képernyőket, és kevésbé észrevehetővé teszik a hibákat. A React Native-ben az UI-hibákhoz Error Boundary-t használnak tartalék komponens megjelenítésével.
Számítási hibák, állapot-összeférhetetlenségek, hibás képernyőátmenetek — logikai hibák gyakran nem vezetnek összeomláshoz, de az alkalmazás hibás viselkedését okozzák. Nehezebb észlelni őket szisztematikus naplózás és monitorozás nélkül, mert nem hoznak létre összeomlási jelentést, és észrevétlenek maradnak a felhasználói panaszig.
Non-Fatal Error abban különbözik a fatal-tól, hogy lehetőséget hagy a programnak a munka folytatására. A fatal error olyan állapot, amelyből az alkalmazás nem tud helyreállni: null pointer dereferálása, verem túlcsordulása, memóriahiány. A non-fatal hiba elkapható, kezelhető és a végrehajtás folytatható, míg a fatal error az alkalmazás újraindítását igényli.
| Jellemző | Non-Fatal Error | Fatal Error |
|---|---|---|
| Alkalmazás megszűnése | Nem | Igen |
| Helyreállítási lehetőség | Igen, catch blokkon keresztül | Nem |
| Naplózás | Kódból recordException segítségével | Csak összeomlás-jelentő által |
| UX hatás | Átmeneti kellemetlenség | A munkamenet teljes elvesztése |
| Példa | Network timeout, parse error | NullPointerException, OOM |
A non-fatal és fatal közötti határ függhet a megvalósítástól. Hálózati időtúllépés az egyik alkalmazásban non-fatal-ként van kezelve (kérés megismétlése 1–2 másodperc után), egy másikban lehet fatális (összeomlás kezelő hiányában). A minőségi hibakezelés a potenciálisan fatális helyzeteket nem végzetessé alakítja, növelve az alkalmazás stabilitását. A hibakezelő rendszer tervezése az egyik legfontosabb építészeti feladat a magas megbízhatósági követelményekkel rendelkező mobilalkalmazás fejlesztése során. A beépített monitorozó rendszer lehetővé teszi a csapat számára a nem végzetes hibák gyors észlelését és kijavítását, mielőtt azok jelentős számú felhasználót érintenének.
Firebase Crashlytics — a nem végzetes hibák naplózásának fő eszköze mobilalkalmazásokban. A recordException metódus lehetővé teszi egy non-fatal kivétel rögzítését teljes stack trace-szel és végrehajtási kontextussal, anélkül hogy megszakítaná az alkalmazás működését. Az összeomlási jelentésektől eltérően a recordException a kód bármely pontján meghívható az elkapott kivételek naplózására.
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: tartalék adatokat használunk
Crashlytics.recordException(e)
showFallbackContent()
}
}
// Naplózás felhasználói kulcsokkal
Crashlytics.setCustomKey("screen", "Profile")
Crashlytics.setCustomKey("api_version", "v3")
Sentry — alternatíva a Crashlytics-hez, részletesebb non-fatal hiba diagnosztikával. A Sentry SDK captureException metódust biztosít, amely elküldi a kivétel részleteit a szerverre. A Sentry kulcsfontosságú előnye a hasonló non-fatal hibák egyetlen issue-ba csoportosítása, az ismétlődési gyakoriság elemzése és a végrehajtási kontextus breadcrumbs formájában — a felhasználói műveletek sorrendje a hiba előtt.
Nem minden non-fatal hibát kell naplózni. Várható állapotok — hálózati hiba kapcsolat hiányában — szelektíven naplózhatók. Váratlan hibák — NullPointerException a kezelt kódban, hibás adatformátum, logic error — mindig naplózandók. Minden csapat meghatározza a jelentőségi küszöböt: átlagosan 10–20 egyedi non-fatal hiba 1000 felhasználónként naponta normálisnak tekinthető. Fontos riasztásokat beállítani a non-fatal hibák számának hirtelen növekedésére — ez jelezheti az API új verziójával kapcsolatos problémákat vagy a kiadás utáni regressziót.
Az alapvető kezelési mechanizmus — try-catch, amely elkapja a kivételt és végrehajtja a helyreállítási kódot. Hálózati műveletek esetén a tipikus minta a kérés megismétlése exponenciális késleltetéssel (retry with backoff). Elemzési hibák esetén — alapértelmezett tartalékértékek használata és a kontextus naplózása a későbbi szerveroldali elemzéshez.
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 típusok — alternatív megközelítés kivételek nélkül. A függvény egy sealed class Result-ot ad vissza Success és Failure változatokkal. A hívó kód mindkét változatot kifejezetten kezeli, ami kiküszöböli a kezeletlen hibákat. A Result típusok népszerűek Kotlinban (Result
Minden non-fatal hibatípushoz helyreállítási stratégiát kell előirányozni: gyorsítótárazott adatok betöltése hálózati hiba esetén, alapértelmezett értékek használata elemzési hiba esetén, komponens újrainicializálása UI hiba esetén. Jó gyakorlat egy toast vagy snackbar megjelenítése a hibaüzenettel, de nem az alkalmazással való interakció teljes blokkolása. Fontos különbséget tenni a helyreállítható (recoverable) és a nem helyreállítható hibák között — az utóbbiaknál a helyreállítási stratégia más lesz, például a képernyő újraindításának vagy az adatok törlésének javaslata. Az előző sikeres állapot gyorsítótárazása gyakran a legegyszerűbb és leghatékonyabb módja a non-fatal hibák kezelésének mobil platformokon.
Gyakran ismételt kérdések
Warning — a fordító vagy statikus elemző figyelmeztetése egy potenciális problémára a kódban. Non-fatal error — egy futásidejű kivétel, amely már megtörtént, de nem vezetett összeomláshoz. A warning a fordítás előtt kiküszöbölhető, a non-fatal error a végrehajtás során egy catch blokkon keresztül kezelhető.
Nem, a túlzott naplózás eltömíti a monitorozást. Érdemes a váratlan hibákat naplózni termelésben, és figyelmen kívül hagyni a várható állapotokat: hálózati hiba kapcsolat hiányában szelektíven naplózandó, a NullPointerException a kezelt kódban viszont mindig. Minden csapat meghatározza a jelentőségi küszöböt az alkalmazás kontextusa alapján.
A SwiftUI-ban ObservableObject-et használnak @Published errorState mezővel a hibás állapot követésére. A View feliratkozik a változásokra és alternatív tartalmat jelenít meg. iOS 17 előtt Combine-t alkalmaztak kezelőkkel, iOS 17-től kezdve — SwiftData-t és @Observable makrókat a reaktív UI frissítéshez.
Igen, ha a hiba láncreakciót vált ki. Példa: egy nem végzetes képbetöltési hiba az UI hibás állapotához vezethet, amely aztán összeomlást okoz a megjelenítési kísérlet során. A non-fatal hibák minőségi kezelése minden szinten megakadályozza azok fatal szintre eszkalálódását.
iOS-ben a non-fatal hibákat do-catch segítségével kezelik throw-val, Androidban — try-catch-csel kivételekkel. iOS NSError-t használ domainekkel és hibakódokkal, Android — Java/Kotlin kivételeket. A Crashlytics mindkét platformon ugyanúgy működik a recordException-en keresztül, egységes felületet biztosítva a monitorozáshoz.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is