Kotlin'de istisna yönetimi try/catch/finally yapısı ile gerçekleştirilir, ancak Java'dan farklı olarak Unchecked Exceptions'a vurgu yapar ve sade bir sözdizimine sahiptir. Önemli bir fark, Kotlin'de checked exceptions'ın olmamasıdır; bu, programcının throws belirtmekten ve bu tür istisnaları yakalamaktan kurtarır.
Java, checked/unchecked exceptions kullanmaktadır; burada checked olanlar açık bir şekilde yakalamayı veya bildirimde bulunmayı gerektirir. Bu genellikle gereksiz boilerplate koduna ve rahatsız edici bir koda yol açar. Kotlin daha basit bir şekilde tasarlanmıştır — tüm istisnalar genellikle unchecked (RuntimeException'den türetilmiştir), bu da işlemeyi kolaylaştırır ve kodu daha okunabilir hale getirir.
Java geliştiricileri Kotlin'de checked exceptions'ları yakalamaya ve belirtmeye çalıştıklarında — kod derlenir, ancak anlam kaybolur. Ayrıca finally kullanımının nüanslarını bilmeden kullanılması, sızıntılara veya çalışmayan kodlara yol açabilir.
Kotlin'de try/catch/finally'i kısaca ve amaca uygun şekilde kullanalım:
fun process(data: String): Int = try { data.toInt() } catch (e: NumberFormatException) { 0 } finally { println("İşlem tamamlandı") }
Anahtar özellikler:
Finally bloğunda bir istisna fırlatılırsa ne olur? Bu, değer dönüşünü nasıl etkiler?
Finally'den fırlatılan istisnalar, try/catch bloğundan gelen herhangi bir başka istisna veya return'ü her zaman geçersiz kılar; bu, hata nedenine dair önemli verilerin kaybolmasına neden olabilir.
fun demo(): Int = try { 1 } finally { throw RuntimeException("finally içinde hata") }
Kotlin'de try/catch bir ifade olabilir mi? Java'dan farkı nedir?
Evet. Kotlin'deki try/catch/finally ifadeleri, bu nedenle sonuç döndürebilir ve değerlerin geçerli olduğu yerlerde kullanılabilir.
val value = try { risky() } catch (e: Exception) { fallback() }
Java'da bu sadece operatörlerdir.
Kotlin'de, throws ile belirti olan bir dış Java işlevi çağrılırsa istisnaları yakalamak zorunlu mu?
Hayır. Checked exceptions, Kotlin derleyicisi tarafından görmezden gelindiği için; bunları açıkça yakalamak zorunda değilsiniz, ancak yine de çalışma zamanında fırlatılabilirler.
Her yerde catch (e: Exception) koymak, gerçek ve beklenen hataları ayırt etmeden. Finally'yi değer döndürmek için kullanmak, hatalar olduğunda beklenmedik davranışlara yol açar.
Artılar:
Eksiler:
Sadece beklenen hataları yakalayarak, finally'yi yalnızca kaynakları temizlemek için kullanarak ve try/catch'i ifadeler olarak kullanarak okunabilirliği artırıyorlar.
Artılar:
Eksiler: