Error Boundary — apa itu, komponen React Native dan penanganan kesalahan

Penulis: IT Sectr Diterbitkan: 2026-05-27 Waktu membaca: 8 mnt

Error Boundary adalah komponen React yang menangkap kesalahan JavaScript di pohon komponen anaknya dan menampilkan antarmuka cadangan, bukan halaman crash. Dalam konteks React Native, ia mencegah aplikasi crash total pada kesalahan rendering yang tidak fatal. Menurut React Documentation, 2024, error boundary menangkap kesalahan di metode render, lifecycle-hooks dan konstruktor komponen anak, memungkinkan aplikasi untuk terus berjalan. Di React Native hal ini sangat kritis, karena aplikasi seluler tidak dapat dimuat ulang dengan F5 — pengguna kehilangan seluruh sesi.

Poin Utama

  • Error Boundary — komponen React untuk menangkap kesalahan rendering di pohon anak
  • ComponentDidCatch — metode siklus hidup yang menerima kesalahan dan informasi stack
  • Fallback UI — antarmuka cadangan yang ditampilkan sebagai pengganti komponen yang rusak
  • React Native menggunakan Error Boundary untuk mencegah crash total aplikasi
  • Keterbatasan — Error Boundary tidak menangkap kesalahan di kode asinkron dan event-handler

Apa itu Error Boundary

Error Boundary adalah mekanisme React untuk graceful degradation saat kesalahan rendering. Diperkenalkan di React 16 (2017) sebagai komponen pembungkus yang mengimplementasikan salah satu dari dua metode siklus hidup: static getDerivedStateFromError atau componentDidCatch. Error Boundary memungkinkan pengguna melihat pesan yang bermakna, bukan layar putih kosong atau crash total aplikasi.

Bagaimana Error Boundary muncul

Sebelum React 16, setiap kesalahan yang tidak ditangani di render menyebabkan crash seluruh aplikasi dengan pelepasan seluruh pohon DOM. Di aplikasi web, ini berarti layar putih kosong, di React Native — crash total aplikasi dengan kembali ke Home Screen. Tim React memperkenalkan Error Boundary sebagai analog dari blok catch untuk UI deklaratif, meminjam konsep dari pendekatan “biarkan crash” di bahasa Erlang.

Pentingnya untuk React Native

Di React Native, tidak adanya Error Boundary berarti crash total aplikasi pada setiap kesalahan rendering. Pengguna kehilangan seluruh sesi saat ini tanpa kemungkinan pemulihan. Error Boundary di React Native sangat penting, karena aplikasi seluler tidak dimuat ulang seperti halaman web — sesi pengguna hilang secara permanen dan pengguna harus memulai semuanya dari awal.

Bagaimana Error Boundary bekerja di React Native

Error Boundary bekerja di tingkat pohon React. Ketika komponen anak melempar kesalahan di render atau lifecycle, React tidak melepas seluruh pohon, tetapi mengalihkan kontrol ke Error Boundary terdekat di atas hierarki. Boundary memanggil getDerivedStateFromError, mengatur state.hasError = true dan me-render fallback UI sebagai pengganti cabang komponen yang rusak.

typescript
import React, { Component, ErrorInfo, ReactNode } from "react"

interface Props {
    children: ReactNode
    fallback?: ReactNode
}

interface State {
    hasError: boolean
    error?: Error
}

class ErrorBoundary extends Component<Props, State> {
    constructor(props: Props) {
        super(props)
        this.state = { hasError: false }
    }

    static getDerivedStateFromError(error: Error): State {
        return { hasError: true, error }
    }

    componentDidCatch(error: Error, info: ErrorInfo) {
        console.error("Ditangkap oleh boundary:", error)
        Crashlytics.recordException(error)
    }

    render() {
        if (this.state.hasError) {
            return this.props.fallback || <FallbackUI />
        }
        return this.props.children
    }
}

getDerivedStateFromError mengatur status untuk rendering fallback UI — ini adalah metode statis yang dipanggil pada tahap rendering sebelum perubahan dikomit. componentDidCatch dijalankan pada tahap komit dan ditujukan untuk efek samping: logging, mengirim laporan crash ke Crashlytics, analytics. Dua metode membagi tanggung jawab antara manajemen status UI dan tindakan sampingan.

Membuat komponen Error Boundary

Untuk membuat Error Boundary, Anda perlu mengimplementasikan komponen kelas dengan metode getDerivedStateFromError dan/atau componentDidCatch. Komponen fungsional tidak bisa menjadi Error Boundary — React mendukung fungsionalitas ini hanya untuk komponen kelas, karena akses ke metode siklus hidup diperlukan. Pustaka react-error-boundary menyediakan implementasi siap pakai dengan API hooks untuk kemudahan.

typescript
// Contoh penggunaan Error Boundary di React Native
import { ErrorBoundary } from "react-error-boundary"

const FallbackComponent = ({ error, resetError }: FallbackProps) => (
    <View style={styles.container}>
        <Text>Ada yang tidak beres</Text>
        <Text>{error.message}</Text>
        <Button title="Coba Lagi" onPress={resetError} />
    </View>
)

const App = () => (
    <SafeAreaView>
        <ErrorBoundary FallbackComponent={<FallbackComponent />}>
            <UserProfile userId={"123"} />
        </ErrorBoundary>
        <BottomNavigation />
    </SafeAreaView>
)

Tingkat pembungkusan — Error Boundary dapat ditempatkan di berbagai tingkat hierarki. Satu Boundary global di root aplikasi akan menampilkan fallback UI pada setiap kesalahan, tetapi navigasi tetap berfungsi. Beberapa Boundary di tingkat layar memungkinkan isolasi kesalahan: jika satu layar rusak, yang lain terus bekerja secara independen. react-error-boundary menyederhanakan mekanisme Reset melalui hook useErrorBoundary, memungkinkan pengaturan ulang status tanpa memuat ulang. Untuk proyek tipikal, skema dengan tiga tingkat Boundary dianggap optimal untuk aplikasi React Native.

Mengatur ulang status Error Boundary

Setelah terjadinya kesalahan, pengguna dapat menekan tombol “Coba Lagi” yang mengatur ulang hasError ke false dan me-render ulang pohon anak. Mekanisme Reset penting untuk memulihkan fungsi aplikasi tanpa memuat ulang. Di react-error-boundary digunakan callback onReset yang dapat membersihkan cache, meminta ulang data, atau memperbarui status di atas pohon.

Keterbatasan Error Boundary

Error Boundary tidak menangkap kesalahan asinkron — kesalahan di setTimeout, setInterval, Promise, async/await. React tidak dapat menangkap kesalahan di luar siklus render dan lifecycle-hooks, karena mereka dijalankan dalam konteks eksekusi lain. Untuk kesalahan asinkron diperlukan try-catch terpisah di handler atau handler global untuk event unhandledrejection.

Event-handler

Kesalahan di onClick, onChange dan event-handler lainnya tidak ditangkap oleh Error Boundary, karena dijalankan di luar rendering React. Penanganan kesalahan untuk event-handler harus di dalam handler itu sendiri melalui try-catch. Pustaka react-error-boundary menyediakan hook useErrorHandler untuk mengirimkan kesalahan dari event-handler ke Boundary terdekat.

Server-side rendering dan Next.js

Error Boundary tidak bekerja di sisi server di Next.js atau Gatsby. Metode getDerivedStateFromError dan componentDidCatch tidak dipanggil saat SSR, karena metode siklus hidup hanya tersedia di browser. Untuk kesalahan server diperlukan strategi terpisah: try-catch di getServerSideProps, halaman fallback error.js (Next.js 13+) atau middleware global.

Lapisan native React Native

Di React Native, Error Boundary tidak mencegah crash di tingkat modul native. Crash native (segfault, out-of-memory, exception native) terjadi di tingkat Objective-C atau Java dan tidak mencapai lapisan JavaScript. Untuk crash native diperlukan Crashlytics NDK (Android) atau KSCrash (iOS). Error Boundary hanya melindungi lapisan JavaScript dari aplikasi React Native.

Praktik terbaik Error Boundary

Tempatkan Error Boundary di batas modul bermakna: satu Boundary per layar, satu per widget pengembang pihak ketiga, satu per formulir kompleks. Ini mengisolasi kesalahan dan memungkinkan pengguna terus bekerja di bagian aplikasi lainnya. Boundary root harus selalu ada — untuk kesalahan kritis di komponen navigasi umum atau provider. Setiap Boundary bertanggung jawab atas fragmen antarmukanya sendiri dan tidak memengaruhi komponen tetangga saat terjadi kesalahan.

Logging dan monitoring

Selalu kirimkan kesalahan ke Crashlytics atau Sentry melalui componentDidCatch. Tambahkan konteks: nama layar, userId, versi aplikasi, parameter navigasi. Di Sentry tersedia breadcrumbs — urutan tindakan pengguna sebelum kesalahan. Untuk analisis frekuensi kesalahan non-fatal, gunakan dashboard Crashlytics dengan pengelompokan berdasarkan issue.

Fallback UI

Jangan gunakan fallback “kosong” — buat antarmuka yang bermakna. Set yang direkomendasikan untuk React Native: pesan kesalahan (ramah pengguna, bukan teknis), tombol “Coba Lagi”, tautan ke dukungan atau chat. Hindari View kosong — pengguna akan berpikir aplikasi telah rusak total dan menutupnya. Fallback harus terintegrasi ke dalam desain keseluruhan aplikasi.

Menguji Error Boundary

Uji setiap Error Boundary dengan React Testing Library atau React Native Testing Library. Buat komponen pemicu yang melempar kesalahan saat rendering dan periksa apakah fallback UI ditampilkan. Untuk pengujian integrasi, gunakan storybook dengan berbagai status Error Boundary: normal, kesalahan, status setelah pengaturan ulang. Pengujian otomatis Boundary menjamin bahwa saat komponen berubah, fallback UI terus bekerja dengan benar di production. Cakupan pengujian setiap Boundary harus menjadi persyaratan wajib code review untuk proyek React Native.

Pertanyaan yang Sering Diajukan

Mengapa Error Boundary tidak bekerja dengan komponen fungsional?

React mengimplementasikan Error Boundary hanya melalui komponen kelas, karena akses ke metode siklus hidup componentDidCatch dan getDerivedStateFromError diperlukan. Komponen fungsional tidak memiliki metode tersebut. Pustaka react-error-boundary menyediakan pembungkus kelas siap pakai dengan API hooks untuk kemudahan penggunaan.

Bagaimana Error Boundary memengaruhi kinerja?

Dampaknya minimal — Error Boundary menambahkan pemeriksaan status pada setiap rendering pohon anak. Perbandingan state.hasError adalah operasi O(1) dengan kompleksitas konstan. Saat tidak ada kesalahan, overhead tidak ada. Hanya saat terjadi kesalahan, Boundary melakukan rendering tambahan fallback UI.

Apakah setiap komponen perlu dibungkus dalam Error Boundary?

Tidak, 2–3 tingkat sudah cukup: Boundary root untuk seluruh aplikasi, Boundary layar untuk setiap cabang navigasi dan Boundary lokal untuk widget kritis (formulir pembayaran, peta, chat). Jumlah Boundary yang berlebihan memperumit arsitektur tanpa manfaat yang signifikan.

Bagaimana Error Boundary bekerja dengan Suspense di React 18+?

Error Boundary dan Suspense bersifat independen: Suspense menangkap pemuatan (pending Promise di React 18+), Error Boundary menangkap kesalahan rendering. Keduanya dapat dikombinasikan: <ErrorBoundary><Suspense><Component /></Suspense></ErrorBoundary>. Suspense dijalankan pertama saat pemuatan, Error Boundary — saat kesalahan komponen yang dimuat.

Apa perbedaan Error Boundary dengan try-catch di React?

try-catch menangkap kesalahan di kode imperatif sinkron, tetapi tidak dapat menangkap kesalahan rendering JSX. Error Boundary dirancang khusus untuk UI deklaratif: ia menangkap kesalahan di render, lifecycle-hooks dan konstruktor komponen anak, yang tidak dapat dilakukan try-catch karena karakteristik rendering React.

Kesimpulan

  • Error Boundary — komponen React untuk menangkap kesalahan rendering dengan menampilkan fallback UI
  • ComponentDidCatch — metode untuk logging kesalahan, getDerivedStateFromError — untuk manajemen status UI
  • React Native sangat membutuhkan Error Boundary untuk mencegah crash total aplikasi
  • Keterbatasan — tidak menangkap kesalahan asinkron, kesalahan di event-handler, SSR dan lapisan native
  • react-error-boundary — pustaka siap pakai dengan API hooks untuk integrasi mudah dalam proyek
  • Tingkat pembungkusan — root, layar (disarankan) dan lokal untuk widget kritis
  • Fallback UI harus bermakna: pesan kesalahan, tombol coba lagi, kontak dukungan

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

Baca juga