Android'de hata işleme

Kotlin, denetlenen istisnaları desteklemez. Bu sayede, yalnızca kurtarılabilir istisnaları işlemeyi seçebileceğiniz için hata işleme süreci basitleşir ve kolaylaşır. 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 bir HomeException hatası verir. Uygulama geliştirici, 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 bir örnek:

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

Home API'lerindeki tüm yöntemler HomeException hatası verebilir. Bu nedenle, tüm çağrılarda HomeException hatasını yakalamak için try-catch bloğu kullanmanızı öneririz.

HomeException ile 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ıp sonucu kontrol edin.

İşlenmeyen 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 sıralayıcı kontrolü hatası veya işlem iptali gibi bir eşzamanlılık sorunu nedeniyle iptal edildi.
ALREADY_EXISTS İstemcinin oluşturmaya çalıştığı öğe (ör. dosya veya dizin) zaten mevcut.
API_NOT_CONNECTED İstemci, bağlanamayan bir API'den yöntem ç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 bilgi için alt hata kodlarını kontrol edin.
CURSOR_WINDOW_NOT_SUPPORTED CursorWindow kullanan bir yöntem çağrıldı ancak CursorWindow etkin değil veya mevcut bağlamda desteklenmiyor.
DATA_LOSS Kurtarılamayan veri kaybı veya bozulması meydana geldi.
DEADLINE_EXCEEDED İşlem tamamlanmadan önce son tarih sona erdi. 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 kullanımdan kaldırmaya uygun olmadığından kullanımdan kaldırma işlemi başarısız oldu.
FAILED_PRECONDITION Sistem, işlemin yürütülmesi için gereken durumda olmadığından işlem reddedildi. Örneğin, OvenCavityOperationalStateTrait cihazının stop komutu zaten durdurulmuş bir fırında çağrıldıysa bu mesajı alabilirsiniz.
INTERNAL Dahili hatalar. Bu, temel sistem tarafından beklenen bazı sabitlerin 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ı. İstek, kademeli özellik sunumu veya belgelenmemiş izin verilenler listesi gibi tüm kullanıcı sınıfı için reddedilirse NOT_FOUND kullanılabilir. Bir istek, kullanıcı sınıfındaki bazı kullanıcılar için reddedilirse (ör. kullanıcı tabanlı erişim denetimi) PERMISSION_DENIED kullanılmalıdır.
OUT_OF_RANGE İşlem, geçerli aralığın dışında denenmiş. Örneğin, end-of-file sonrasında arama veya okuma yapılmış. INVALID_ARGUMENT hatasının aksine bu hata, sistem durumu değişirse düzeltilebilecek bir sorunu gösterir.
PERMISSION_DENIED Arayanın, belirtilen işlemi yürütme izni yok. PERMISSION_DENIED, bir kaynağın tükenmesinden kaynaklanan retler için kullanılmamalıdır (bu hatalar için RESOURCE_EXHAUSTED kullanın). Arayan tanımlanamıyorsa PERMISSION_DENIED kullanılmamalıdır (bu hatalar için UNAUTHENTICATED kullanın). Bu hata kodu, isteğin geçerli olduğu veya istenen öğenin mevcut olduğu ya da diğer ön koşulları karşıladığı anlamına gelmez.
RESOURCE_EXHAUSTED Kullanıcı başına kotaya ulaşıldığı veya dosya sisteminin tamamında yer kalmadığı için bazı kaynaklar tükenmiş olabilir. Örneğin, bir evcil hayvan besleme cihazında DispenseTrait özelliğinin dispense komutu çağrılırsa ancak cihazda mama kalmadıysa bu hata verilebilir.

Bu durum, Home API'leri proje kotasının aşılmasından da kaynaklanabilir. Daha fazla bilgi için Kota yönetimi başlıklı makaleyi inceleyin.
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ışırsa ancak özellik, SDK başlatılırken dahil edilmediyse bu hata verilir. Android'de Ana Sayfa'yı ilk kullanıma hazırlama 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 büyük olasılıkla geçici bir durumdur ve geri çekilerek yeniden deneme yoluyla düzeltilebilir. Eş kuvvetli 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 herhangi biri kullanılarak sınıflandırılamayan bir hata durumu oluştuğunda görünür. Örneğin, harici bir API'den alınan durum değeri, temel neden hakkında yeterli bilgi içermediğinde bu hata döndürülebilir.
WRITE_FAILED Yazma işlemi yürütülemedi. Daha fazla bilgi için alt hata kodlarını kontrol edin.