Penanganan kesalahan dalam pengembangan seluler: apa itu, teknik apa, dan cara mengaturnya

Penulis: IT Sectr Diterbitkan: 2026-05-23 Waktu membaca: 11 mnt

Penanganan kesalahan adalah keterampilan mendasar bagi pengembang seluler. Menurut HackerOne (2025), 62% kebocoran data terjadi karena pengecualian yang tidak ditangani. Penanganan kesalahan yang tepat tidak hanya mencegah crash, tetapi juga melindungi data pengguna. Mari kita lihat pendekatan untuk iOS, Android, dan React Native.

Poin penting

  • iOS menggunakan do-catch, throw, guard let, dan if-let untuk penanganan kesalahan. Swift tidak mengizinkan pengecualian yang tidak ditangani di tingkat bahasa.
  • Android/Kotlin menawarkan try-catch, operator elvis, sealed class, dan tipe Result. Sealed class adalah alat yang kuat untuk memodelkan keadaan kesalahan.
  • Kotlin Result dan Either dari pustaka fungsional memaksa penanganan kesalahan pada waktu kompilasi, membuat kode lebih andal.
  • Crash Reporting (Crashlytics, Sentry) adalah alat wajib untuk produksi. Tanpanya, Anda hanya tahu tentang bug dari pengguna.
  • Error Boundary di React Native mencegah crash total aplikasi karena kesalahan JavaScript. Gunakan untuk komponen root.

Penanganan Kesalahan di iOS: Do-Catch, Throw, Guard Let

Penanganan kesalahan di Swift dibangun di atas empat mekanisme utama: do-catch, throws, guard let, dan if-let. Tidak seperti banyak bahasa, Swift tidak mengizinkan pengecualian yang tidak tertangkap — setiap kesalahan harus ditangani secara eksplisit atau dideklarasikan melalui throws. Penanganan kesalahan adalah keterampilan penting untuk pengembangan seluler, yang secara langsung memengaruhi stabilitas aplikasi.

Do-Catch dan Throw

do-catch adalah blok standar untuk memanggil fungsi yang ditandai dengan throws. Di dalam do, sebuah fungsi dipanggil dengan try, dan jika melempar kesalahan, kontrol berpindah ke catch. Berbagai jenis kesalahan dapat ditangani melalui pattern matching. Jika kesalahan tidak ditangani, kesalahan akan menyebar ke atas tumpukan (Error Propagation). Untuk penanganan kesalahan yang efektif di iOS, gunakan do-catch sebagai mekanisme utama.

Throw dideklarasikan dalam tanda tangan fungsi: func fetchData() throws -> Data. Ini berarti kode pemanggil harus menangani kesalahan melalui try, try?, atau try!. try? mengubah kesalahan menjadi nil, try! menyebabkan crash saat terjadi kesalahan (gunakan hanya jika Anda yakin akan berhasil). Penanganan kesalahan melalui throw adalah praktik wajib di Swift.

Optional/Nullable dan Guard Let

Guard let adalah konstruksi untuk keluar awal dari fungsi jika nilainya nil. Tidak seperti if-let, guard let memerlukan jalan keluar (return, throw, break) di cabang else. Ini membuat kode lebih rata dan mudah dibaca — tanpa blok if bersarang. Jika optional tidak mungkin nil — gunakan force unwrap (!), hanya ketika Anda benar-benar yakin. Dalam aplikasi seluler, guard let membantu menghindari crash saat menangani nilai opsional.

Optional Chaining (user?.address?.city) dan nil-coalescing (??) adalah gula sintaksis untuk bekerja dengan optional tanpa membuka bungkusnya. Di IT Sectr, kami menggunakan guard let untuk memvalidasi parameter input API dan mewajibkan tim untuk menghindari force unwrap tanpa komentar eksplisit. Penangan kesalahan di setiap tingkat melindungi dari kegagalan yang tidak terduga.

Penanganan Kesalahan di Android: Try-Catch, Elvis, Sealed Class

Kotlin adalah bahasa utama untuk pengembangan Android. Ia mewarisi try-catch dari Java, tetapi menambahkan alternatif yang lebih aman: operator elvis, require, check, dan sealed class. Penanganan kesalahan di Kotlin dibangun di atas kombinasi mekanisme ini. Tidak seperti Swift, Kotlin tidak memerlukan penanganan pengecualian yang diperiksa (semua pengecualian tidak diperiksa). Untuk penanganan kesalahan dalam aplikasi seluler di Android, gunakan sealed class sebagai pola utama.

Try-Catch dan Operator Elvis

Try-catch di Kotlin berfungsi sebagai ekspresi — ia mengembalikan nilai. val result = try { fetchData() } catch (e: Exception) { fallbackValue }. Ini mempersingkat kode. Operator Elvis (?:) adalah analog dari nil-coalescing untuk tipe nullable: val name = user?.name ?: "Guest". Untuk penanganan kesalahan dalam aplikasi seluler, try-catch sebagai ekspresi adalah pendekatan yang paling ringkas.

Sealed class adalah alat yang kuat untuk memodelkan keadaan sukses dan kesalahan. sealed class NetworkResult { data class Success(val data: T) : NetworkResult(); data class Error(val message: String) : NetworkResult() }. Ketika digunakan dalam ekspresi when, kompiler memeriksa kelengkapan cabang. Penanganan kesalahan melalui sealed class menjamin bahwa tidak ada keadaan yang tidak ditangani.

kotlin
// Sealed class + try-catch — pola tipikal untuk 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}")
    }
}

Dalam contoh, sealed class NetworkResult memodelkan dua keadaan: sukses dengan data dan kesalahan dengan pesan. Fungsi fetchUser mengembalikan hasil dalam hal apa pun, dan kode pemanggil menangani kedua cabang melalui when. Ini menghilangkan kemungkinan kesalahan yang tidak ditangani. Penanganan kesalahan melalui sealed class adalah standar untuk pengembangan Android di IT Sectr.

Penanganan Kesalahan di Kotlin: Result dan Either

Result adalah tipe bawaan Kotlin untuk mewakili hasil operasi yang mungkin gagal. Ia memaksa penanganan sukses dan gagal melalui fold, getOrThrow, atau map. Result berguna dalam rantai asinkron (coroutines). Penanganan kesalahan dengan Result adalah standar untuk pengembangan seluler di Kotlin.

Result vs Either

Either adalah tipe fungsional dari pustaka Arrow yang memungkinkan pengembalian nilai dari salah satu dari dua tipe (Left — kesalahan, Right — sukses). Tidak seperti Result, Either dapat berisi tipe kesalahan apa pun yang ditentukan pengguna. Untuk proyek sederhana, Result bawaan sudah cukup; untuk proyek kompleks, gunakan Either dari Arrow. Pilihan alat penanganan kesalahan tergantung pada kompleksitas proyek.

Perambatan Kesalahan

Perambatan kesalahan adalah mekanisme di mana kesalahan merambat ke atas tumpukan panggilan sampai ditangani. Di Kotlin, ini terjadi secara default (pengecualian tidak diperiksa). Di Swift, ini hanya berlaku untuk fungsi yang ditandai dengan throws. Dengan Result dan Either, kesalahan tidak merambat — mereka tetap berada dalam tipe dan Anda harus menanganinya. Ini membuat penanganan kesalahan dalam aplikasi seluler lebih aman.

Parameter iOS (Swift) Android (Kotlin)
Mekanisme dasardo-catch + throwstry-catch (expression)
Optional/Nullableguard let, if-let, ???. let, elvis (?:)
Pendekatan fungsionalResult (Swift 5+)Result, Either (Arrow)
Pemodelan kesalahanEnum: ErrorSealed class
Pengecualian diperiksaYa (throws)Tidak (semua tidak diperiksa)
Non-fatalos_log, CrashlyticsTimber, Crashlytics

Tabel menunjukkan perbedaan utama. iOS memerlukan deklarasi kesalahan eksplisit (throws), membuat kode lebih aman tetapi lebih panjang. Android mengandalkan disiplin pengembang. Di IT Sectr, kami menggunakan sealed class untuk Android dan throws untuk iOS — ini adalah praktik terbaik kedua platform untuk penanganan kesalahan dalam aplikasi seluler.

Pelaporan Crash: Crashlytics dan Sentry

Pelaporan crash adalah sistem untuk mengumpulkan dan menganalisis crash aplikasi. Pelaporan crash adalah bagian penting dari penanganan kesalahan dalam produksi. Tanpanya, Anda mengetahui masalah dari pengguna, yang tidak dapat diterima untuk produksi. Dua alat utama: Firebase Crashlytics (gratis) dan Sentry (gratis untuk penggunaan dasar). Untuk penanganan kesalahan dalam aplikasi seluler, selalu terapkan pelaporan crash dari rilis pertama.

Firebase Crashlytics

Crashlytics adalah bagian dari Firebase. Ia secara otomatis mengumpulkan crash, mengelompokkannya berdasarkan tumpukan panggilan, dan menunjukkan jumlah pengguna yang terkena dampak. Ia mendukung pencatatan kesalahan non-fatal melalui recordException(). Integrasi: tambahkan SDK ke build.gradle (Android) atau Podfile (iOS). Crashlytics adalah alat gratis terbaik untuk penanganan kesalahan saat memulai proyek.

Sentry

Sentry adalah sistem pemantauan kesalahan lintas platform. Tidak seperti Crashlytics, Sentry menyediakan pelacakan terperinci (breadcrumbs), pemantauan kinerja, dan dukungan React Native. Ini memungkinkan Anda melihat status aplikasi pada saat terjadi kesalahan. IT Sectr merekomendasikan Sentry untuk proyek yang memerlukan kontrol penuh atas penanganan kesalahan dalam pengembangan seluler.

Error Boundary di React Native

Error Boundary adalah komponen React yang menangkap kesalahan JavaScript di pohon komponen anak dan menampilkan UI cadangan, mencegah crash total aplikasi. Error Boundary adalah komponen kunci untuk penanganan kesalahan di React Native. Gunakan error boundaries untuk layar kritis dan navigasi. Penanganan kesalahan dalam aplikasi seluler di React Native memerlukan pengaturan Error Boundary yang tepat di tingkat atas.

Implementasi Error Boundary

Error Boundary dibuat melalui componentDidCatch(error, errorInfo) atau static getDerivedStateFromError(error). Ia tidak menangkap kesalahan dalam kode asinkron (setTimeout, requestAnimationFrame), rendering sisi server, atau kesalahan asli (Native Modules). Untuk pencatatan, gunakan SDK pelaporan crash di dalam componentDidCatch. Error Boundary adalah penangan kesalahan yang sederhana namun efektif untuk lapisan UI.

Kesalahan Fatal vs Non-Fatal

Kesalahan fatal adalah pengecualian yang tidak ditangani yang menyebabkan crash aplikasi. Kesalahan non-fatal adalah pengecualian yang Anda tangkap dan tangani, tetapi menunjukkan masalah dalam kode. Kesalahan non-fatal dicatat melalui Crashlytics/Sentry dan membantu menemukan bug sebelum menjadi fatal. Baik kesalahan fatal maupun non-fatal memerlukan penanganan kesalahan yang tepat dalam pengembangan seluler.

Pertanyaan yang Sering Diajukan

Apa perbedaan antara try-catch dan Result di Kotlin?

try-catch adalah mekanisme bahasa untuk pengecualian. Result adalah tipe pembungkus yang memaksa penanganan kesalahan pada waktu kompilasi. Di IT Sectr, kami lebih memilih Result untuk logika bisnis dan try-catch untuk bekerja dengan sistem eksternal. Kedua pendekatan adalah bagian dari penanganan kesalahan umum di Kotlin.

Apa itu Error Boundary di React Native?

Error Boundary adalah komponen React yang menangkap kesalahan JavaScript di pohon komponen anak dan menampilkan UI cadangan alih-alih membuat seluruh aplikasi crash. Ia tidak menangkap kesalahan dalam kode asinkron atau rendering sisi server. Error Boundary adalah elemen penting dari penanganan kesalahan dalam aplikasi seluler di React Native.

Haruskah saya menggunakan Crashlytics atau Sentry untuk proyek baru?

Crashlytics (Firebase) adalah pilihan terbaik untuk memulai: gratis, integrasi sederhana, pengelompokan crash otomatis. Sentry untuk proyek yang memerlukan pelacakan kesalahan terperinci dan pemantauan kinerja. Pilihan alat penanganan kesalahan tergantung pada anggaran dan persyaratan pemantauan.

Apa itu kesalahan non-fatal dan apa bedanya dengan kesalahan fatal?

Kesalahan fatal adalah crash aplikasi (pengecualian yang tidak tertangkap). Kesalahan non-fatal adalah pengecualian yang Anda tangkap dan tangani, tetapi menunjukkan masalah dalam kode. Kesalahan non-fatal dicatat secara terpisah dan membantu menemukan bug sebelum menjadi fatal. Penanganan kesalahan dalam aplikasi seluler harus mencakup pemantauan kedua jenis.

Kapan harus menggunakan guard let alih-alih if-let di Swift?

guard let digunakan untuk keluar awal dari fungsi ketika nilai tidak ada — ini membuat kode lebih linear dan mudah dibaca. if-let cocok ketika optional diperlukan di dalam blok dan tidak diperlukan keluar dari fungsi. guard let lebih disukai untuk memvalidasi parameter input dan merupakan bagian dari penanganan kesalahan di iOS.

Ringkasan

  • iOS menggunakan do-catch, throws, dan guard let — setiap kesalahan harus dideklarasikan dalam tanda tangan fungsi. Penanganan kesalahan di iOS memerlukan deklarasi eksplisit.
  • Android/Kotlin menawarkan try-catch sebagai ekspresi, operator elvis, dan sealed class untuk memodelkan kesalahan. Penanganan kesalahan di Android lebih fleksibel tetapi memerlukan disiplin.
  • Sealed class dan Result adalah praktik terbaik untuk penanganan kesalahan fungsional di Kotlin. Mereka menghilangkan keadaan yang tidak ditangani.
  • Pelaporan Crash (Crashlytics, Sentry) wajib untuk produksi. Mulailah dengan Crashlytics, beralih ke Sentry seiring pertumbuhan proyek. Penanganan kesalahan dalam aplikasi seluler tidak mungkin tanpa pemantauan.
  • Error Boundary di React Native mencegah crash UI total. Gunakan di tingkat navigasi tertinggi.
  • Kesalahan non-fatal sama pentingnya dengan kesalahan fatal — mereka menunjukkan masalah sebelum crash aplikasi. Penangan kesalahan harus mencatat kedua jenis.
  • Global Exception Handler adalah garis pertahanan terakhir. Terapkan Thread.setDefaultUncaughtExceptionHandler (Android) atau NSSetUncaughtExceptionHandler (iOS) untuk mencatat semua kesalahan yang tidak tertangkap.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek