Penanganan error di Android

Kotlin tidak mendukung pengecualian yang diperiksa. Hal ini menyederhanakan dan mengefisienkan penanganan error, karena Anda dapat memilih untuk menangani hanya pengecualian yang berpotensi dapat dipulihkan. Selain itu, karena Anda tidak perlu menangani setiap kemungkinan pengecualian secara eksplisit, kode Anda menjadi lebih rapi dan karenanya, 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 mereka atau menampilkan pesan seperti "Structure not found" 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}",
     )
   }

Metode apa pun di Home API dapat menampilkan HomeException, jadi sebaiknya gunakan blok try-catch untuk menangkap HomeException pada semua panggilan.

Saat menangani HomeException, periksa kolom error.code dan error.message untuk mempelajari penyebab masalah. Mungkin ada juga kode sub-error, jadi panggil metode getSubErrorCodes() dan periksa hasilnya.

Setiap pengecualian yang tidak ditangani akan menyebabkan aplikasi Anda error.

Tabel berikut memberikan arti kode HomeException yang mungkin Anda temui:

Tabel: HomeException kode
Kode Arti
ABORTED Operasi dibatalkan, umumnya karena masalah konkurensi seperti kegagalan pemeriksaan pengurut 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 jika perangkat sedang offline atau tidak mendukung API yang coba dipanggil oleh klien.
CANCELLED Operasi dibatalkan, biasanya oleh pemanggil.
COMMAND_FAILED Perintah gagal dieksekusi. Periksa kode sub-error untuk mengetahui detail selengkapnya.
CURSOR_WINDOW_NOT_SUPPORTED Metode yang menggunakan CursorWindow dipanggil, tetapi CursorWindow tidak diaktifkan atau tidak didukung dalam konteks saat ini.
DATA_LOSS Terjadi kehilangan atau kerusakan data yang tidak dapat dipulihkan.
DEADLINE_EXCEEDED Batas waktu berakhir sebelum operasi selesai. Untuk operasi yang mengubah keadaan sistem, error ini mungkin ditampilkan bahkan jika operasi tersebut telah selesai.
DECOMMISSIONING_INELIGIBLE Penonaktifan gagal karena perangkat tidak memenuhi syarat untuk penonaktifan.
FAILED_PRECONDITION Operasi tersebut ditolak karena sistem tidak dalam keadaan dibutuhkan untuk menjalankan operasi. Misalnya, Anda mungkin mendapatkan pesan ini jika perintah stop dari OvenCavityOperationalStateTrait dipanggil pada oven yang sudah berhenti.
INTERNAL Error internal. Artinya beberapa invarian yang diperlukan 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.
INVALID_DATA_HOLDER Penampung data tidak valid.
NOT_FOUND Entitas yang diminta, seperti file atau direktori, tidak ditemukan. Jika permintaan ditolak pada seluruh kelas pengguna, seperti peluncuran bertahap atau daftar yang diberi akses, NOT_FOUND dapat digunakan. Jika permintaan ditolak pada beberapa pengguna di dalam suatu kelas pengguna, seperti pada kontrol akses basis pengguna, PERMISSION_DENIED harus digunakan.
OUT_OF_RANGE Upaya operasi dilakukan melampaui rentang yang valid, seperti mencari tahu atau membaca melampaui end-of-file. Tidak seperti INVALID_ARGUMENT, error ini menunjukkan masalah yang mungkin 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 apabila pemanggil tidak dapat di identifikasi (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, kemungkinan karena kuota per pengguna tercapai atau seluruh sistem file kehabisan ruang. Misalnya, error ini dapat ditampilkan jika perintah dispense dari DispenseTrait dipanggil pada perangkat pet-feeder, tetapi tidak ada lagi makanan yang tersisa di unit.

Hal ini mungkin juga disebabkan oleh kuota project Home API yang terlampaui. Untuk mengetahui informasi selengkapnya, lihat Pengelolaan kuota.
SDK_INITIALIZATION_MISSING_INFO SDK diinisialisasi tanpa semua informasi yang diperlukan. Misalnya, error ini ditampilkan jika klien mencoba mendapatkan TraitFactory untuk ID trait tertentu, tetapi trait tersebut tidak disertakan saat menginisialisasi SDK. Lihat Menginisialisasi smart home di Android.
UNAUTHENTICATED Pemanggil tidak dapat diidentifikasi atau permintaan tidak memiliki kredensial autentikasi yang valid
UNAVAILABLE Layanan tidak tersedia. Kemungkinan besar ini hanya kondisi sementara yang dapat diperbaiki dengan mencoba kembali menggunakan backoff. Perlu diketahui 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 kondisi error terjadi 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 cukup mengenai penyebab utamanya.
WRITE_FAILED Penulisan gagal dieksekusi. Periksa kode sub-error untuk mengetahui detail selengkapnya.