İstisnaları Yeniden Fırlatma ve Zincirleme
İstisnaları seçerek yeniden fırlatın ve alt düzey hataları neden zincirleriyle sarmalayın.
İstisnaları Yeniden Fırlatma ve Zincirleme, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.
Yeniden Fırlatma ve Sarma
Bazen bir özel durumu yalnızca daha belirli bir özel durumun yayılmasına izin vermeden önce onu günlüğe kaydetmek, sarmak veya dönüştürmek için yakalarsınız. Kotlin bunu deyimsel biçimde yapmanızı sağlar.
Doğrudan Yeniden Fırlatma
Yeniden fırlatmak için yalnızca throw e ifadesini tekrar kullanın; yayılma bir sonraki işleyiciye devam eder.
fun main() {
try {
try { "x".toInt() }
catch (e: NumberFormatException) {
println("logging: ${e.message}")
throw e // re-throw original
}
} catch (e: NumberFormatException) {
println("outer caught: ${e.message}")
}
}Özel Durumla Sarma
Zinciri korumak için yeni bir özel durum oluştururken özgün özel durumu cause olarak geçirin.
class ParseException(msg: String, cause: Throwable) : RuntimeException(msg, cause)
fun main() {
try {
try { "xyz".toInt() }
catch (e: NumberFormatException) {
throw ParseException("could not parse user input", e)
}
} catch (e: ParseException) {
println("got: ${e.message}")
println("cause: ${e.cause?.message}")
}
}Neden Zincirini İnceleme
cause özelliği önceki özel duruma bağlanır. Kök nedeni tamamen yazdırmak için bu zinciri izleyin.
fun main() {
val e = RuntimeException("top",
RuntimeException("middle",
RuntimeException("root")))
var current: Throwable? = e
while (current != null) {
println(current.message)
current = current.cause
}
}Seçmeli Yeniden Fırlatma
Geniş bir türü yakalayın, ardından beklediğiniz durumla eşleşmiyorsa yeniden fırlatın.
fun parseRequired(s: String): Int {
try {
return s.toInt()
} catch (e: NumberFormatException) {
if (s.isBlank()) return 0
throw e // unexpected — let it propagate
}
}
fun main() {
println(parseRequired("42"))
println(parseRequired(""))
// parseRequired("abc") // throws
}Bağlam Ekleme
Özgün özel durumun içermediği bağlamı (girdi, istek kimliği vb.) eklemek için bir alan özel durumuyla sarın.
class UploadError(msg: String, cause: Throwable) : RuntimeException(msg, cause)
fun upload(file: String) {
try { throw RuntimeException("disk full") }
catch (e: Throwable) { throw UploadError("uploading $file failed", e) }
}
fun main() {
try { upload("photo.jpg") }
catch (e: UploadError) { println("${e.message} <- ${e.cause?.message}") }
}Yığın İzini Kaybetmeyin
Sararken özgün özel durumu her zaman cause olarak geçirin; aynı iletiye sahip ancak nedeni olmayan yeni bir özel durum oluşturmayın. Yığın izi, hata ayıklama sürecindeki en önemli yardımcınızdır.
class Wrapped(m: String, cause: Throwable) : RuntimeException(m, cause)
fun main() {
try {
try { error("inner") }
catch (e: Throwable) { throw Wrapped("outer", e) }
} catch (e: Wrapped) {
println("message: ${e.message}")
println("cause: ${e.cause?.message}")
}
}Sarmadan Yeniden Fırlatma
İhtiyacınız olan tek şey günlüğe kaydetmekse, günlük çağrısından sonra yalnızca throw e kullanın; sarmaya gerek yoktur.
fun risky() {
try { throw IllegalStateException("oops") }
catch (e: IllegalStateException) {
println("Logging before rethrow: ${e.message}")
throw e
}
}
fun main() {
try { risky() }
catch (e: IllegalStateException) { println("outer: ${e.message}") }
}Yeniden Fırlatma Sırasında Temizleme için finally
Yeniden fırlatma sırasında bile kaynakları temizlemek için finally kullanın.
fun process() {
try {
throw RuntimeException("failure")
} finally {
println("cleanup ran")
}
}
fun main() {
try { process() }
catch (e: RuntimeException) { println("caught: ${e.message}") }
}Bastırılmış Özel Durumlar
finally bloğunun kendisi hata fırlatırsa özgün özel durum varsayılan olarak bastırılır. Her ikisini de korumak için addSuppressed kullanın.
fun main() {
val primary = RuntimeException("primary")
val secondary = RuntimeException("from cleanup")
primary.addSuppressed(secondary)
println(primary.suppressed.joinToString { it.message ?: "?" })
}Karşıt Örüntü: Yutup Farklı Bir Özel Durum Fırlatma
Bir istisnayı yakalayıp ilgisiz, yeni bir istisna fırlatmak (neden belirtmeden) hata ayıklama bilgilerini yok eder. Her zaman cause değerini aktarın.
// BAD
// catch (e: IOException) { throw RuntimeException("error") }
// GOOD
// catch (e: IOException) { throw RuntimeException("error reading config", e) }
fun main() { println("Pass cause when re-throwing!") }Kısa Kontrol
Bir istisnayı yeni bir istisnayla sarmaladığınızda, özgün yığın izini korumak için ne yapmalısınız?
Özet
Yeniden fırlatmak için: throw e. Sarmalamak için cause = e içeren yeni bir istisna fırlatın. Neden zincirini her zaman koruyun — nedeni olmayan bir sarmalayıcı oluşturmayın. Temizleme işlemleri için finally, temizleme işleminin kendisi başarısız olduğunda ise addSuppressed kullanın.
Sıkça Sorulan Sorular
“İstisnaları Yeniden Fırlatma ve Zincirleme” dersi ücretsiz mi?
Evet — “İstisnaları Yeniden Fırlatma ve Zincirleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.
“İstisnaları Yeniden Fırlatma ve Zincirleme” dersinde ne öğreneceğim?
İstisnaları seçerek yeniden fırlatın ve alt düzey hataları neden zincirleriyle sarmalayın. Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“İstisnaları Yeniden Fırlatma ve Zincirleme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- İfade Olarak try/catch/finally
- Özel İstisna Sınıfları Oluşturma
- runCatching ve Result
- İstisnaları Yeniden Fırlatma ve Zincirleme