Penanganan error di Android

Kotlin tidak mendukung pengecualian terkontrol. Hal ini menyederhanakan dan menyederhanakan penanganan error, karena Anda dapat memilih untuk hanya menangani pengecualian yang berpotensi dapat dipulihkan. Selain itu, karena Anda tidak perlu menangani setiap kemungkinan pengecualian secara eksplisit, kode Anda akan lebih rapi dan akibatnya, tetap lebih berfokus pada tujuan utamanya.

Kegagalan yang dapat dipulihkan adalah masalah yang dapat ditangani developer dari sisi mereka. Misalnya, jika ID yang digunakan dalam panggilan tidak valid, API akan menampilkan HomeException dengan pesan invalid data. Developer aplikasi kemudian dapat memilih untuk menghapus ID tersebut dari cache atau menampilkan pesan seperti "Struktur tidak ditemukan" kepada pengguna.

Contoh cara menangani kegagalan yang dapat dipulihkan:

val result =
   try {
     homeManager.requestPermissions()
   } catch (e: HomeException) {
     PermissionsResult(
       PermissionsResultStatus.ERROR,
       "Got HomeException with error: ${e.message}",
     )
   }

Setiap metode di Home API dapat menampilkan HomeException, jadi sebaiknya gunakan blok try-catch untuk menangkap HomeException di semua panggilan.

Saat menangani HomeException, periksa kolom code dan message untuk mempelajari masalah yang terjadi.

Setiap pengecualian yang tidak ditangani akan menyebabkan aplikasi Anda error.

Tabel berikut memberikan arti kode HomeException yang mungkin Anda hadapi:

Tabel: kode HomeException
Kode Arti
ABORTED Operasi dibatalkan, biasanya karena masalah konkurensi seperti kegagalan pemeriksaan sequencer atau pembatalan transaksi.
ALREADY_EXISTS Entitas yang coba dibuat oleh klien, misalnya file atau direktori, sudah ada.
API_NOT_CONNECTED Klien mencoba memanggil metode dari API yang gagal terhubung. Hal ini dapat terjadi saat perangkat offline atau tidak mendukung API yang coba dipanggil klien.
CANCELLED Operasi dibatalkan, biasanya oleh pemanggil.
DATA_LOSS Terjadi kerusakan atau kehilangan data yang tidak dapat dipulihkan.
DEADLINE_EXCEEDED Batas waktu berakhir sebelum operasi selesai. Untuk operasi yang mengubah status sistem, error ini mungkin ditampilkan, meskipun operasi tersebut telah selesai.
FAILED_PRECONDITION Operasi tersebut ditolak karena sistem tidak dalam status yang diperlukan untuk menjalankan operasi. Misalnya, Anda mungkin mendapatkan pesan ini jika perintah stop dari OvenCavityOperationalStateTrait dipanggil di oven yang sudah berhenti, atau jika Anda mencoba menjalankan operasi rmdir di non-direktori.
INTERNAL Error internal. Artinya, beberapa invarian yang diharapkan oleh sistem pokok telah rusak. Kode error ini disediakan untuk error yang bersifat serius.
INVALID_ARGUMENT Klien memberikan argumen yang berada di luar rentang nilai yang diharapkan.
NOT_FOUND Entitas yang diminta, seperti file atau direktori, tidak ditemukan. Jika permintaan ditolak untuk seluruh kelas pengguna, seperti peluncuran fitur secara bertahap atau daftar yang diberi akses, NOT_FOUND dapat digunakan. Jika permintaan ditolak untuk beberapa pengguna dalam suatu kelas pengguna, seperti kontrol akses berbasis pengguna, PERMISSION_DENIED harus digunakan.
OUT_OF_RANGE Upaya operasi dilakukan melampaui rentang yang valid, seperti mencari atau membaca melampaui end-of-file. Tidak seperti INVALID_ARGUMENT, error ini menunjukkan masalah yang dapat diperbaiki jika status sistem berubah.
PERMISSION_DENIED Pemanggil tidak memiliki izin untuk menjalankan operasi yang ditentukan. PERMISSION_DENIED tidak boleh digunakan untuk penolakan yang disebabkan oleh kehabisan beberapa resource (gunakan RESOURCE_EXHAUSTED untuk error tersebut). PERMISSION_DENIED tidak boleh digunakan jika pemanggil tidak dapat diidentifikasi (gunakan UNAUTHENTICATED untuk error tersebut). Kode error ini tidak menyatakan bahwa suatu permintaan valid atau entitas yang diminta ada atau memenuhi prakondisi lainnya.
RESOURCE_EXHAUSTED Beberapa resource telah habis, mungkin karena kuota per pengguna telah tercapai atau seluruh sistem file kehabisan ruang. Misalnya, error ini dapat ditampilkan jika perintah dispense dari DispenseTrait dipanggil di perangkat pemberi makan hewan peliharaan, tetapi tidak ada lagi makanan yang tersisa di unit.
SDK_INITIALIZATION_MISSING_INFO SDK diinisialisasi tanpa semua informasi yang diperlukan. Misalnya, error ini ditampilkan jika klien mencoba mendapatkan TraitFactory untuk ID ciri tertentu, tetapi ciri tersebut tidak disertakan saat menginisialisasi SDK. Lihat Melakukan inisialisasi rumah di Android.
UNAUTHENTICATED Pemanggil tidak dapat diidentifikasi atau permintaan tidak memiliki kredensial autentikasi yang valid.
UNAVAILABLE Layanan tidak tersedia. Kemungkinan besar ini adalah kondisi sementara, yang dapat diperbaiki dengan mencoba kembali menggunakan backoff. Perhatikan bahwa mencoba kembali operasi non-idempoten tidak selalu aman.
UNIMPLEMENTED Operasi yang diminta tidak diterapkan, didukung, atau diaktifkan dalam layanan ini.
UNKNOWN Error tidak diketahui. UNKNOWN muncul saat terjadi kondisi error yang tidak dapat diklasifikasikan menggunakan kode error lainnya. Misalnya, error ini dapat ditampilkan saat nilai status yang diterima dari API eksternal tidak memiliki informasi yang memadai tentang akar masalahnya.