Penanganan error di Android

Kotlin tidak mendukung pengecualian yang diperiksa. Hal ini menyederhanakan dan mengefisienkan penanganan error, karena Anda dapat memilih untuk hanya menangani pengecualian yang berpotensi dapat dipulihkan. Dan karena Anda tidak perlu menangani setiap kemungkinan pengecualian secara eksplisit, kode Anda tidak terlalu berantakan dan akibatnya, tetap lebih fokus pada tujuan utamanya.

Kegagalan yang dapat dipulihkan adalah masalah yang dapat diatasi oleh 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 error.code dan error.message untuk mengetahui penyebab masalahnya. Mungkin juga ada sub-kode 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: kode HomeException
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 dijalankan. Periksa subkode error untuk mengetahui detail selengkapnya.
CURSOR_WINDOW_NOT_SUPPORTED Metode yang dipanggil menggunakan CursorWindow, tetapi CursorWindow tidak diaktifkan atau tidak didukung dalam konteks saat ini.
DATA_LOSS Data hilang atau rusak yang tidak dapat dipulihkan telah terjadi.
DEADLINE_EXCEEDED Batas waktu berakhir sebelum operasi selesai. Untuk operasi yang mengubah status sistem, error ini mungkin ditampilkan, bahkan jika operasi tersebut telah selesai.
DECOMMISSIONING_INELIGIBLE Pencabutan gagal karena perangkat tidak memenuhi syarat untuk dicabut.
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 Pemegang data tidak valid.
NOT_FOUND Entity yang diminta, seperti file atau direktori, tidak ditemukan. Jika permintaan ditolak untuk seluruh kelas pengguna, seperti peluncuran fitur bertahap atau daftar yang diizinkan yang tidak terdokumentasi, NOT_FOUND dapat digunakan. Jika permintaan ditolak pada beberapa pengguna di dalam suatu kelas pengguna, seperti pada kontrol akses basis pengguna, maka, 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 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 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, kemungkinan 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 dispenser makanan hewan peliharaan, tetapi tidak ada lagi makanan yang tersisa di unit.

Hal ini juga dapat disebabkan oleh terlampauinya kuota project Home API. 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 karakteristik tertentu, tetapi karakteristik tersebut tidak disertakan saat melakukan inisialisasi 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 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 di 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 jika nilai status yang diterima dari API eksternal tidak memiliki informasi yang memadai mengenai penyebab utamanya.
WRITE_FAILED Penulisan gagal dijalankan. Periksa subkode error untuk mengetahui detail selengkapnya.