0Pricing
Kotlin Academy · Ders

CoroutineExceptionHandler: Genel Yakalanmamış İstisna İşleyicisi

İşlenmemiş istisnaları günlüğe kaydetmek veya bunlardan kurtulmak için CoroutineExceptionHandler kurun.

CoroutineExceptionHandler: Genel Yakalanmamış İstisna İşleyicisi, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 2. 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.

CoroutineExceptionHandler Nedir?

CoroutineExceptionHandler, yakalama işleyicisi olmayan koroutinlerden gelen yakalanmamış istisnaları ele alan bir bağlam öğesidir. Son çare olarak görev yapar.

import kotlinx.coroutines.*
val handler = CoroutineExceptionHandler { context, exception ->
    println("Caught unhandled: ${exception.message}")
}
fun main() = runBlocking {
    val scope = CoroutineScope(Dispatchers.Default + handler)
    scope.launch { throw RuntimeException("oops") }
    delay(100)
}

Yalnızca Kök Koroutinler İçin

CoroutineExceptionHandler yalnızca kök koroutinlerden gelen istisnaları yakalar (doğrudan bir kapsam üzerinde başlatılan koroutinler). Alt koroutinler işleyiciye değil, üst görevlerine yayılır.

import kotlinx.coroutines.*
val handler = CoroutineExceptionHandler { _, e -> println("Handler: ${e.message}") }
fun main() = runBlocking {
    // Root coroutine — handler fires:
    CoroutineScope(handler).launch {
        throw RuntimeException("root error")
    }
    delay(100)
    // NOT handler (child of coroutineScope):
    // launch { launch { throw RuntimeException() } }
}

İstisnayı Bastırmaz

İşleyici, istisna koroutini zaten iptal ettikten sonra çağrılır. Günlük kaydı, çökme raporlaması veya temizleme içindir — yürütmeyi sürdürmek için değildir.

import kotlinx.coroutines.*
val handler = CoroutineExceptionHandler { _, e ->
    println("[CrashReport] ${e::class.simpleName}: ${e.message}")
    // send to Crashlytics, Sentry, etc.
}
fun main() = runBlocking {
    CoroutineScope(SupervisorJob() + handler).apply {
        launch { throw IllegalStateException("state error") }
        launch { delay(100); println("still alive") }
        delay(200)
        cancel()
    }
}

İşleyici + Denetleyici İşi

SupervisorJob + CoroutineExceptionHandler birleşimi, uzun ömürlü kapsamlar için standart kalıptır: alt görevler birbirinden bağımsız olarak başarısız olur ve işlenmemiş hatalar günlüğe kaydedilir.

import kotlinx.coroutines.*
class AppScope {
    private val handler = CoroutineExceptionHandler { _, e ->
        println("Uncaught: ${e.message}")
    }
    val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default + handler)
}
fun main() = runBlocking {
    val app = AppScope()
    app.scope.launch { throw RuntimeException("task failed") }
    app.scope.launch { delay(100); println("other task ok") }
    delay(200)
    app.scope.cancel()
}

İşleyici ile Eşzamansız Çalışma

async için istisnalar Deferred içinde saklanır ve await() çağrıldığında fırlatılır. Ertelenmiş işlem beklenmezse async için işleyici NOT tetiklenir.

import kotlinx.coroutines.*
val handler = CoroutineExceptionHandler { _, e -> println("Handler: ${e.message}") }
fun main() = runBlocking {
    val scope = CoroutineScope(SupervisorJob() + handler)
    val deferred = scope.async { throw RuntimeException("async error") }
    try {
        deferred.await()  // exception thrown here
    } catch (e: RuntimeException) {
        println("Caught from await: ${e.message}")
    }
    delay(50)
    scope.cancel()
}

Thread.UncaughtExceptionHandler Karşılaştırması

Java'nın UncaughtExceptionHandler öğesinden farklı olarak Kotlin'in işleyicisi koroutin bağlamının parçasıdır ve yalnızca o kapsam içindeki koroutinlere uygulanır.

import kotlinx.coroutines.*
// Java style (applies to threads):
Thread.setDefaultUncaughtExceptionHandler { t, e ->
    println("Thread ${t.name} threw: ${e.message}")
}
// Kotlin coroutine style (applies to coroutines in scope):
val handler = CoroutineExceptionHandler { _, e ->
    println("Coroutine threw: ${e.message}")
}
fun main() = runBlocking { println("Handlers target different concurrency models") }

MDC ile Günlük Kaydı Kalıbı

Sunucu uygulamalarında işleyici, günlük kaydı çerçevesine iletmeden önce yapılandırılmış günlük kaydı için koroutin bağlamı bilgilerini (istek kimlikleri gibi) yakalayabilir.

import kotlinx.coroutines.*
val handler = CoroutineExceptionHandler { ctx, e ->
    val jobName = ctx[CoroutineName]?.name ?: "unknown"
    println("[${jobName}] ERROR: ${e.message}")
}
fun main() = runBlocking {
    CoroutineScope(SupervisorJob() + handler).launch(CoroutineName("DataLoader")) {
        throw RuntimeException("fetch failed")
    }
    delay(100)
}

Çökme Raporlaması Entegrasyonu

Yakalanmamış istisnaları Firebase Crashlytics veya Sentry gibi çökme raporlama hizmetlerine iletmek için işleyiciyi kullanın.

import kotlinx.coroutines.*
object CrashReporter {
    fun record(e: Throwable) = println("[Crashlytics] ${e.message}")
}
val handler = CoroutineExceptionHandler { _, e ->
    if (e !is CancellationException) CrashReporter.record(e)
}
val appScope = CoroutineScope(SupervisorJob() + Dispatchers.Default + handler)
fun main() = runBlocking {
    appScope.launch { throw RuntimeException("unhandled in production") }
    delay(100)
    appScope.cancel()
}

İşleyici Kalıtımı

Üst bağlamdaki işleyici alt koroutinler tarafından otomatik olarak devralınmaz. Tetiklenmesi için kök koroutinin bağlamında bulunmalıdır.

import kotlinx.coroutines.*
val handler = CoroutineExceptionHandler { _, e -> println("Handler: ${e.message}") }
fun main() = runBlocking {
    // Handler only fires at root level:
    CoroutineScope(SupervisorJob() + handler).launch {
        // Child of root — exception propagates to root handler:
        launch { throw RuntimeException("nested") }
    }
    delay(100)
}

En İyi Uygulama Özeti

Uygulama düzeyindeki veya özellik düzeyindeki kapsamlarınıza her zaman bir CoroutineExceptionHandler yükleyin. İptal istisnaları dışındaki her istisnayı günlüğe kaydedin. Denetim akışı için ona asla güvenmeyin — yalnızca gözlemlenebilirlik sağlar.

import kotlinx.coroutines.*
val globalHandler = CoroutineExceptionHandler { ctx, e ->
    if (e !is CancellationException) {
        println("[ERROR] ${ctx[CoroutineName]?.name}: ${e.message}")
    }
}
val appScope = CoroutineScope(SupervisorJob() + Dispatchers.Default + globalHandler)
fun main() = runBlocking {
    appScope.launch(CoroutineName("Auth")) { throw RuntimeException("token expired") }
    delay(100); appScope.cancel()
}

Kısa Kontrol

CoroutineExceptionHandler hangi koroutin türü için otomatik olarak NOT tetiklenir?

Özet

CoroutineExceptionHandler, kök koroutinlerdeki yakalanmamış istisnaları gözlemleyen son çare işleyicisidir. Uzun ömürlü kapsamlar için SupervisorJob ile birleştirin. Günlük kaydı ve çökme raporlaması için kullanın — denetim akışı için asla kullanmayın.

Sıkça Sorulan Sorular

“CoroutineExceptionHandler: Genel Yakalanmamış İstisna İşleyicisi” dersi ücretsiz mi?

Evet — “CoroutineExceptionHandler: Genel Yakalanmamış İstisna İşleyicisi” 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.

“CoroutineExceptionHandler: Genel Yakalanmamış İstisna İşleyicisi” dersinde ne öğreneceğim?

İşlenmemiş istisnaları günlüğe kaydetmek veya bunlardan kurtulmak için CoroutineExceptionHandler kurun. 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 2. dersidir.

“CoroutineExceptionHandler: Genel Yakalanmamış İstisna İşleyicisi” 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

  1. SupervisorJob ve Job: Hata Yalıtımı
  2. CoroutineExceptionHandler: Genel Yakalanmamış İstisna İşleyicisi
  3. async/await İstisna Yayılımı
  4. Dayanıklı Koroutin Mimarileri Tasarlama
← Kotlin Academy Sayfasına Dön