Pamamahala ng error sa mobile development: ano ito, anong mga teknik at kung paano ayusin

May-akda: IT Sectr Nai-publish: 2026-05-23 Oras ng pagbabasa: 11 min

Ang pamamahala ng error ay isang pangunahing kasanayan para sa mobile developer. Ayon sa HackerOne (2025), 62% ng mga paglabas ng data ay nangyayari dahil sa mga hindi pinamahalaang exception. Ang wastong pamamahala ng error hindi lamang pumipigil sa mga crash, kundi pinoprotektahan din ang data ng gumagamit. Suriin natin ang mga approach para sa iOS, Android at React Native.

Mga pangunahing punto

  • Ang iOS ay gumagamit ng do-catch, throw, guard let at if-let para sa pamamahala ng error. Hindi pinapayagan ng Swift ang mga hindi pinamahalaang exception sa antas ng wika.
  • Ang Android/Kotlin ay nag-aalok ng try-catch, elvis operator, sealed class at Result type. Ang sealed class ay isang makapangyarihang tool para sa pagmomodelo ng mga estado ng error.
  • Ang Kotlin Result at Either mula sa functional library ay pumipilit sa pamamahala ng error sa oras ng compilation, ginagawang mas maaasahan ang code.
  • Ang Crash Reporting (Crashlytics, Sentry) ay isang mandatoryong tool para sa produksyon. Kung wala ito, malalaman mo lang ang mga bug mula sa mga gumagamit.
  • Ang Error Boundary sa React Native ay pumipigil sa kumpletong pag-crash ng app dahil sa mga error sa JavaScript. Gamitin ito para sa root component.

Pamamahala ng Error sa iOS: Do-Catch, Throw, Guard Let

Ang pamamahala ng error sa Swift ay binuo sa apat na pangunahing mekanismo: do-catch, throws, guard let at if-let. Hindi tulad ng maraming wika, hindi pinapayagan ng Swift ang mga hindi nahuhuling exception — bawat error ay dapat na tahasang pamahalaan o ideklara sa pamamagitan ng throws. Ang pamamahala ng error ay isang kritikal na kasanayan para sa mobile development, na direktang nakakaapekto sa katatagan ng application.

Do-Catch at Throw

do-catch ay ang karaniwang bloke para sa pagtawag ng mga function na may markang throws. Sa loob ng do, ang isang function ay tinatawag gamit ang try, at kung ito ay maghagis ng error, ang kontrol ay lilipat sa catch. Ang iba't ibang uri ng error ay maaaring pamahalaan sa pamamagitan ng pattern matching. Kung ang isang error ay hindi pinamahalaan, ito ay kumakalat pataas sa stack (Error Propagation). Para sa epektibong pamamahala ng error sa iOS, gamitin ang do-catch bilang pangunahing mekanismo.

Throw ay idineklara sa lagda ng function: func fetchData() throws -> Data. Ibig sabihin nito ay dapat pamahalaan ng tumatawag na code ang error sa pamamagitan ng try, try? o try!. try? ginagawang nil ang error, try! nagdudulot ng crash kapag may error (gamitin lang kung sigurado ka sa tagumpay). Ang pamamahala ng error sa pamamagitan ng throw ay isang sapilitang kasanayan sa Swift.

Optional/Nullable at Guard Let

Guard let ay isang konstruksyon para sa maagang paglabas mula sa isang function kung ang halaga ay nil. Hindi tulad ng if-let, ang guard let ay nangangailangan ng paglabas (return, throw, break) sa else branch. Ginagawa nitong mas patag at mas nababasa ang code — walang nested if blocks. Kung ang isang optional ay hindi maaaring maging nil — gumamit ng force unwrap (!), kapag ikaw ay lubos na sigurado. Sa isang mobile app, ang guard let ay tumutulong na maiwasan ang mga crash kapag pinangangasiwaan ang mga opsyonal na halaga.

Optional Chaining (user?.address?.city) at nil-coalescing (??) ay syntactic sugar para sa pagtatrabaho sa mga optional nang hindi binubuksan. Sa IT Sectr, gumagamit kami ng guard let para i-validate ang mga input parameter ng API at pinipilit ang team na iwasan ang force unwrap nang walang malinaw na komento. Ang isang tagapangasiwa ng error sa bawat antas ay nagpoprotekta laban sa mga hindi inaasahang pagkabigo.

Pamamahala ng Error sa Android: Try-Catch, Elvis, Sealed Class

Kotlin ay ang pangunahing wika para sa Android development. Namamana nito ang try-catch mula sa Java, ngunit nagdaragdag ng mas ligtas na mga alternatibo: elvis operator, require, check at sealed class. Ang pamamahala ng error sa Kotlin ay binuo sa kombinasyon ng mga mekanismong ito. Hindi tulad ng Swift, ang Kotlin ay hindi nangangailangan ng pamamahala ng mga naka-check na exception (lahat ng exception ay hindi naka-check). Para sa pamamahala ng error sa mga mobile application sa Android, gamitin ang sealed class bilang pangunahing pattern.

Try-Catch at Elvis Operator

Try-catch sa Kotlin ay gumagana bilang isang expression — nagbabalik ito ng halaga. val result = try { fetchData() } catch (e: Exception) { fallbackValue }. Pinapaikli nito ang code. Ang Elvis operator (?:) ay isang analog ng nil-coalescing para sa nullable type: val name = user?.name ?: "Guest". Para sa pamamahala ng error sa mga mobile application, ang try-catch bilang expression ay ang pinaka-maikling approach.

Sealed class ay isang makapangyarihang tool para sa pagmomodelo ng mga estado ng tagumpay at error. sealed class NetworkResult { data class Success(val data: T) : NetworkResult(); data class Error(val message: String) : NetworkResult() }. Kapag ginamit sa isang when expression, sinusuri ng compiler ang pagkakumpleto ng mga branch. Ang pamamahala ng error sa pamamagitan ng sealed class ay ginagarantiyang walang estado ang maiiwan na hindi pinamahalaan.

kotlin
// Sealed class + try-catch — tipikal na pattern para sa Android
sealed class NetworkResult<out T> {
    data class Success<out T>(val data: T) : NetworkResult<T>()
    data class Error(val message: String) : NetworkResult<Nothing>()
}

fun fetchUser(id: String): NetworkResult<User> {
    return try {
        NetworkResult.Success(api.getUser(id))
    } catch (e: Exception) {
        NetworkResult.Error("Failed: ${e.message}")
    }
}

Sa halimbawa, ang sealed class NetworkResult ay nagmomodelo ng dalawang estado: tagumpay na may data at error na may mensahe. Ang function na fetchUser ay nagbabalik ng resulta sa anumang kaso, at ang tumatawag na code ay pinangangasiwaan ang parehong branch sa pamamagitan ng when. Tinatanggal nito ang posibilidad ng isang hindi pinamahalaang error. Ang pamamahala ng error sa pamamagitan ng sealed class ay ang pamantayan para sa Android development sa IT Sectr.

Pamamahala ng Error sa Kotlin: Result at Either

Result ay isang built-in na Kotlin type para kumatawan sa resulta ng isang operasyon na maaaring mabigo. Pinipilit nito ang pamamahala ng tagumpay at pagkabigo sa pamamagitan ng fold, getOrThrow o map. Ang Result ay kapaki-pakinabang sa mga asynchronous chain (coroutines). Ang pamamahala ng error gamit ang Result ay isang pamantayan para sa mobile development sa Kotlin.

Result vs Either

Either ay isang functional type mula sa Arrow library na nagpapahintulot sa pagbabalik ng halaga ng isa sa dalawang type (Left — error, Right — tagumpay). Hindi tulad ng Result, ang Either ay maaaring maglaman ng anumang uri ng error na tinukoy ng gumagamit. Para sa mga simpleng proyekto, sapat na ang built-in na Result; para sa mga kumplikadong proyekto, gamitin ang Either mula sa Arrow. Ang pagpili ng tool sa pamamahala ng error ay depende sa pagiging kumplikado ng proyekto.

Pagpapalaganap ng Error

Pagpapalaganap ng error ay isang mekanismo kung saan ang isang error ay kumakalat pataas sa call stack hanggang sa ito ay mapamahalaan. Sa Kotlin, ito ay nangyayari bilang default (hindi naka-check na exception). Sa Swift, ito ay nalalapat lamang sa mga function na may markang throws. Sa Result at Either, ang mga error ay hindi kumakalat — nananatili sila sa type at dapat mong pamahalaan ang mga ito. Ginagawa nitong mas ligtas ang pamamahala ng error sa mga mobile application.

Parameter iOS (Swift) Android (Kotlin)
Pangunahing mekanismodo-catch + throwstry-catch (expression)
Optional/Nullableguard let, if-let, ???. let, elvis (?:)
Functional approachResult (Swift 5+)Result, Either (Arrow)
Pagmomodelo ng errorEnum: ErrorSealed class
Naka-check na exceptionOo (throws)Hindi (lahat hindi naka-check)
Non-fatalos_log, CrashlyticsTimber, Crashlytics

Ipinapakita ng talahanayan ang mga pangunahing pagkakaiba. iOS ay nangangailangan ng tahasang deklarasyon ng error (throws), ginagawang mas ligtas ang code ngunit mas mahaba. Ang Android ay umaasa sa disiplina ng developer. Sa IT Sectr, gumagamit kami ng sealed class para sa Android at throws para sa iOS — ito ang pinakamahusay na kasanayan ng parehong platform para sa pamamahala ng error sa mga mobile application.

Pag-uulat ng Crash: Crashlytics at Sentry

Pag-uulat ng crash ay isang sistema para sa pagkolekta at pagsusuri ng mga crash ng application. Ang pag-uulat ng crash ay isang mahalagang bahagi ng pamamahala ng error sa produksyon. Kung wala ito, malalaman mo ang mga problema mula sa mga gumagamit, na hindi katanggap-tanggap para sa produksyon. Dalawang pangunahing tool: Firebase Crashlytics (libre) at Sentry (libre para sa pangunahing paggamit). Para sa pamamahala ng error sa mga mobile application, palaging ipatupad ang pag-uulat ng crash mula sa unang release.

Firebase Crashlytics

Crashlytics ay bahagi ng Firebase. Awtomatiko itong nangongolekta ng mga crash, pinapangkat ang mga ito ayon sa call stack, at ipinapakita ang bilang ng mga apektadong gumagamit. Sinusuportahan nito ang pag-log ng mga non-fatal error sa pamamagitan ng recordException(). Pagsasama: idagdag ang SDK sa build.gradle (Android) o Podfile (iOS). Ang Crashlytics ay ang pinakamahusay na libreng tool para sa pamamahala ng error kapag nagsisimula ng isang proyekto.

Sentry

Sentry ay isang cross-platform na sistema ng pagsubaybay sa error. Hindi tulad ng Crashlytics, ang Sentry ay nagbibigay ng detalyadong pagsubaybay (breadcrumbs), pagsubaybay sa pagganap, at suporta sa React Native. Pinapayagan ka nitong tingnan ang estado ng application sa sandali ng error. Inirerekomenda ng IT Sectr ang Sentry para sa mga proyektong nangangailangan ng buong kontrol sa pamamahala ng error sa mobile development.

Error Boundary sa React Native

Error Boundary ay isang React component na pumupukol ng mga error sa JavaScript sa puno ng child component at nagpapakita ng fallback UI, na pumipigil sa kumpletong pag-crash ng application. Ang Error Boundary ay isang pangunahing component para sa pamamahala ng error sa React Native. Gumamit ng error boundaries para sa mga kritikal na screen at navigation. Ang pamamahala ng error sa mga mobile application sa React Native ay nangangailangan ng tamang pag-setup ng Error Boundary sa pinakamataas na antas.

Pagpapatupad ng Error Boundary

Ang Error Boundary ay nilikha sa pamamagitan ng componentDidCatch(error, errorInfo) o static getDerivedStateFromError(error). Hindi nito nahuhuli ang mga error sa asynchronous code (setTimeout, requestAnimationFrame), server-side rendering o native error (Native Modules). Para sa pag-log, gamitin ang crash reporting SDK sa loob ng componentDidCatch. Ang Error Boundary ay isang simple ngunit epektibong tagapangasiwa ng error para sa UI layer.

Fatal vs Non-Fatal na Error

Fatal error ay isang hindi pinamahalaang exception na nagdudulot ng pag-crash ng application. Non-fatal error ay isang exception na iyong nahuli at pinamahalaan, ngunit nagpapahiwatig ng problema sa code. Ang mga non-fatal error ay nai-log sa pamamagitan ng Crashlytics/Sentry at tumutulong na makahanap ng mga bug bago sila maging fatal. Ang parehong fatal at non-fatal error ay nangangailangan ng wastong pamamahala ng error sa mobile development.

Mga Madalas Itanong

Ano ang pagkakaiba ng try-catch at Result sa Kotlin?

try-catch ay isang mekanismo ng wika para sa mga exception. Ang Result ay isang wrapper type na pumipilit sa pamamahala ng error sa oras ng compilation. Sa IT Sectr, mas gusto namin ang Result para sa business logic at try-catch para sa pagtatrabaho sa mga panlabas na sistema. Ang parehong approach ay bahagi ng pangkalahatang pamamahala ng error sa Kotlin.

Ano ang Error Boundary sa React Native?

Error Boundary ay isang React component na pumupukol ng mga error sa JavaScript sa puno ng child component at nagpapakita ng fallback UI sa halip na i-crash ang buong application. Hindi nito nahuhuli ang mga error sa asynchronous code o server-side rendering. Ang Error Boundary ay isang mahalagang elemento ng pamamahala ng error sa mga mobile application sa React Native.

Dapat ba akong gumamit ng Crashlytics o Sentry para sa bagong proyekto?

Crashlytics (Firebase) ay ang pinakamahusay na pagpipilian upang magsimula: libre, simpleng pagsasama, awtomatikong pagpapangkat ng crash. Ang Sentry ay para sa mga proyektong nangangailangan ng detalyadong pagsubaybay sa error at pagsubaybay sa pagganap. Ang pagpili ng tool sa pamamahala ng error ay depende sa badyet at mga kinakailangan sa pagsubaybay.

Ano ang non-fatal error at paano ito naiiba sa fatal?

Fatal error ay isang pag-crash ng application (hindi nahuling exception). Non-fatal error ay isang exception na iyong nahuli at pinamahalaan, ngunit nagpapahiwatig ng problema sa code. Ang mga non-fatal error ay nai-log nang hiwalay at tumutulong na makahanap ng mga bug bago sila maging fatal. Ang pamamahala ng error sa isang mobile application ay dapat may kasamang pagsubaybay sa parehong uri.

Kailan dapat gumamit ng guard let sa halip na if-let sa Swift?

guard let ay ginagamit para sa maagang paglabas mula sa isang function kapag ang isang halaga ay nawawala — ginagawa nitong mas linear at nababasa ang code. Ang if-let ay angkop kapag ang isang optional ay kinakailangan sa loob ng isang block at walang kinakailangang paglabas mula sa function. Ang guard let ay mas gusto para sa pag-validate ng mga input parameter at bahagi ng pamamahala ng error sa iOS.

Buod

  • iOS gumagamit ng do-catch, throws at guard let — bawat error ay dapat ideklara sa lagda ng function. Ang pamamahala ng error sa iOS ay nangangailangan ng tahasang deklarasyon.
  • Android/Kotlin ay nag-aalok ng try-catch bilang expression, elvis operator at sealed class para sa pagmomodelo ng error. Ang pamamahala ng error sa Android ay mas nababaluktot ngunit nangangailangan ng disiplina.
  • Ang sealed class at Result ay ang pinakamahusay na kasanayan para sa functional na pamamahala ng error sa Kotlin. Tinatanggal nila ang mga hindi pinamahalaang estado.
  • Pag-uulat ng Crash (Crashlytics, Sentry) ay sapilitan para sa produksyon. Magsimula sa Crashlytics, lumipat sa Sentry habang lumalaki ang proyekto. Ang pamamahala ng error sa mga mobile application ay imposible nang walang pagsubaybay.
  • Ang Error Boundary sa React Native ay pumipigil sa kumpletong pag-crash ng UI. Gamitin sa pinakamataas na antas ng navigation.
  • Ang mga non-fatal na error ay kasinghalaga ng fatal — nagpapahiwatig sila ng mga problema bago ang pag-crash ng app. Ang isang tagapangasiwa ng error ay dapat mag-log ng parehong uri.
  • Ang Global Exception Handler ay ang huling linya ng depensa. Ipatupad ang Thread.setDefaultUncaughtExceptionHandler (Android) o NSSetUncaughtExceptionHandler (iOS) upang i-log ang lahat ng hindi nahuling error.

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