Android'de hata işleme

Kotlin, checked exceptions'ı desteklemez. Yalnızca kurtarılabilir istisnaları işlemeyi seçebileceğiniz için bu, hata işlemeyi basitleştirir ve kolaylaştırır. Ayrıca, olası her istisnayı açıkça ele almanız gerekmediğinden kodunuz daha az karmaşık olur ve dolayısıyla asıl amacına daha fazla odaklanır.

Kurtarılabilir hatalar, geliştiricinin kendi tarafında çözebileceği sorunlardır. Örneğin, bir çağrıda kullanılan kimlik geçerli değilse API, invalid data mesajıyla birlikte HomeException oluşturur. Uygulama geliştirici daha sonra bu kimliği önbelleğinden kaldırmayı veya kullanıcıya "Yapı bulunamadı" gibi bir mesaj göstermeyi seçebilir.

Kurtarılabilir bir hatanın nasıl ele alınabileceğine dair örnek:

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

Ev API'lerindeki herhangi bir yöntem HomeException oluşturabilir. Bu nedenle, tüm çağrılarda HomeException'i yakalamak için try-catch bloğunu kullanmanızı öneririz.

HomeException ile ilgili işlem yaparken neyin yanlış gittiğini öğrenmek için error.code ve error.message alanlarını kontrol edin. Alt hata kodları da olabilir. Bu nedenle, getSubErrorCodes() yöntemini çağırın ve sonucu kontrol edin.

İşlenmemiş istisnalar, uygulamanızın kilitlenmesine neden olur.

Aşağıdaki tabloda, karşılaşabileceğiniz HomeException kodlarının anlamları verilmiştir:

Tablo: HomeException kodlar
Kod Anlamı
ABORTED İşlem, genellikle eşzamanlılık sorunu (ör. sıralayıcı kontrolü hatası veya işlem iptali) nedeniyle iptal edildi.
ALREADY_EXISTS Bir istemcinin oluşturmaya çalıştığı varlık (ör. dosya veya dizin) zaten mevcut.
API_NOT_CONNECTED İstemci, bağlanamayan bir API'den bir yöntemi çağırmaya çalıştı. Bu durum, cihaz çevrimdışı olduğunda veya istemcinin çağırmaya çalıştığı API'yi desteklemediğinde yaşanabilir.
CANCELLED İşlem, genellikle arayan tarafından iptal edildi.
COMMAND_FAILED Komut yürütülemedi. Daha fazla ayrıntı için alt hata kodlarını kontrol edin.
CURSOR_WINDOW_NOT_SUPPORTED CursorWindow kullanan bir yöntem çağrıldı ancak CursorWindow etkinleştirilmedi veya mevcut bağlamda desteklenmiyor.
DATA_LOSS Kurtarılamaz veri kaybı veya bozulması meydana gelmişse
DEADLINE_EXCEEDED İşlem tamamlanmadan son tarih geçti. Sistemin durumunu değiştiren işlemler için, işlem başarıyla tamamlanmış olsa bile bu hata döndürülebilir.
DECOMMISSIONING_INELIGIBLE Cihaz devre dışı bırakmaya uygun olmadığından devre dışı bırakma işlemi başarısız oldu.
FAILED_PRECONDITION Sistem, işlemin yürütülmesi için gerekli durumda olmadığından işlem reddedildi. Örneğin, stop komutu OvenCavityOperationalStateTrait durdurulmuş bir fırında çağrılırsa bu mesajı alabilirsiniz.
INTERNAL Dahili hatalar. Bu, temel sistemin beklediği bazı değişmezlerin bozulduğu anlamına gelir. Bu hata kodu ciddi hatalar için ayrılmıştır.
INVALID_ARGUMENT İstemci, beklenen değer aralığının dışında bir bağımsız değişken sağladı.
INVALID_DATA_HOLDER Veri sahibi geçersiz.
NOT_FOUND Dosya veya dizin gibi istenen bir öğe bulunamadı. Bir istek, kademeli özellik kullanıma sunma veya belgelenmemiş izin verilenler listesi gibi bir kullanıcı sınıfının tamamı için reddedilirse NOT_FOUND kullanılabilir. Bir kullanıcı sınıfındaki bazı kullanıcılar için istek reddedilirse (ör. kullanıcı tabanlı erişim kontrolü), PERMISSION_DENIED kullanılmalıdır.
OUT_OF_RANGE İşlem, geçerli aralığın dışında denenmiştir. Örneğin, end-of-file'nın ötesinde arama veya okuma yapılmıştır. INVALID_ARGUMENT hatasının aksine bu hata, sistem durumu değiştiğinde düzeltilebilecek bir sorunu gösterir.
PERMISSION_DENIED Arayan kullanıcının belirtilen işlemi gerçekleştirme izni yok. PERMISSION_DENIED, bazı kaynakların tükenmesinden kaynaklanan retler için kullanılmamalıdır (bu tür hatalar için RESOURCE_EXHAUSTED kullanılmalıdır). Arayan tanımlanamıyorsa PERMISSION_DENIED kullanılmamalıdır (bu tür hatalar için UNAUTHENTICATED kullanılmalıdır). Bu hata kodu, isteğin geçerli olduğunu veya istenen öğenin mevcut olduğunu ya da diğer ön koşulları karşıladığını göstermez.
RESOURCE_EXHAUSTED Kullanıcı başına kota sınırına ulaşılması veya dosya sisteminin tamamında alan kalmaması gibi nedenlerle bazı kaynaklar tükenmiş olabilir. Örneğin, dispense komutu bir evcil hayvan besleme cihazında çağrılırsa ancak birimde daha fazla yiyecek kalmamışsa bu hata verilebilir.DispenseTrait
SDK_INITIALIZATION_MISSING_INFO SDK, gerekli tüm bilgiler olmadan başlatıldı. Örneğin, istemci belirli bir özellik kimliği için TraitFactory almaya çalıştığında ancak özellik SDK başlatılırken dahil edilmediğinde bu hata verilir. Android'de evi başlatma başlıklı makaleyi inceleyin.
UNAUTHENTICATED Arayan tanımlanamıyor veya istekte geçerli kimlik doğrulama bilgileri yok.
UNAVAILABLE Hizmet kullanılamıyor. Bu durum büyük olasılıkla geçicidir ve geri çekilme ile yeniden denenerek düzeltilebilir. İdempotent olmayan işlemleri yeniden denemenin her zaman güvenli olmadığını unutmayın.
UNIMPLEMENTED İstenen işlem bu hizmette uygulanmıyor, desteklenmiyor veya etkinleştirilmiyor.
UNKNOWN Bilinmeyen hata. UNKNOWN, diğer hata kodlarından hiçbiri kullanılarak sınıflandırılamayan bir hata durumu oluştuğunda gösterilir. Örneğin, harici bir API'den alınan durum değerinde temel neden hakkında yeterli bilgi olmadığında bu hata döndürülebilir.
WRITE_FAILED Yazma işlemi yürütülemedi. Daha fazla ayrıntı için alt hata kodlarını kontrol edin.