Sobes.tech
Middle

Korutinlerde hata işleme yöntemlerini biliyor musunuz?

sobes.tech yapay zeka

AI'dan gelen yanıt

  • try...catch bloklarının kullanımı. Standart hata işleme yöntemi. Coroutine içinde çalışır.

    // try-catch kullanımı
    suspend fun fetchData(): String {
        return try {
            // Hata fırlatabilecek işlem
            throw Exception("Veri yükleme hatası")
            "Veriler başarıyla yüklendi"
        } catch (e: Exception) {
            "Hata: ${e.message}"
        }
    }
    

    try...catch diğer CoroutineScope içinde başlatılan alt coroutine'lerden fırlatılan yakalanmamış istisnaları işlemek için uygun değildir.

  • CoroutineExceptionHandler. Bu, bu CoroutineScope veya onun alt CoroutineScope'lerinde başlatılan coroutine'ler tarafından atılan yakalanmamış istisnaları yakalar.

    // CoroutineExceptionHandler
    val handler = CoroutineExceptionHandler { _, exception ->
        println("Yakalanan istisna: $exception")
    }
    
    // CoroutineExceptionHandler kullanımı
    GlobalScope.launch(handler) {
        // Hata fırlatabilecek coroutine
        throw Exception("Coroutine'da hata")
    }
    

    CoroutineExceptionHandler, yalnızca yapılandırılmış eşzamanlılık mekanizması tarafından yakalanmayan istisnalar için devreye girer.

  • SupervisorJob ve supervisorScope. Normal Job'dan farklı olarak, hata yapan alt coroutine ana Job'u iptal ederken, SupervisorJob iptal etmez. supervisorScope, SupervisorJob ile bir CoroutineScope oluşturur.

    // supervisorScope kullanımı
    suspend fun loadMultipleData() = supervisorScope {
        val data1 = async {
            // Hata fırlatabilir
            throw Exception("Veri 1 hatası")
            "Veri 1"
        }
        val data2 = async {
            "Veri 2"
        }
    
        // Belirli bir async için hata işleme
        try {
            println("Sonuç 1: ${data1.await()}")
        } catch (e: Exception) {
            println("Veri 1 yüklenirken hata: ${e.message}")
        }
        println("Sonuç 2: ${data2.await()}")
    }
    

    Bağımsız alt görevler için kullanılır, birinin hatası diğerlerini etkilememelidir. try...catch veya CoroutineExceptionHandler'ın yerini almaz, sadece istisna yayılım davranışını değiştirir.

  • Yapılandırılmış eşzamanlılıkta istisna yayılımı. Varsayılan olarak, alt coroutine'deki istisna, ana coroutine'u ve tüm kardeşlerini iptal eder.

    // İstisna yayılımı örneği
    runBlocking {
        val job = launch {
            launch { // Alt coroutine 1
                delay(100)
                throw Exception("Alt 1 hatası")
            }
            launch { // Alt coroutine 2
                delay(200)
                println("Alt 2 tamamlandı")
            }
        }
        try {
            job.join()
        } catch (e: Exception) {
            println("Ana coroutine'da yakalanan istisna: $e")
        }
    }
    

    Bu, yapılandırılmış eşzamanlılığın temel davranışıdır ve kaynak ve durum sızıntılarını önlemeye yardımcı olur.

  • async ve await() kullanımı. async ile fırlatılan istisnalar otomatik olarak yayılmaz. Bunlar Deferred içinde saklanır ve yalnızca await() çağrıldığında fırlatılır.

    // async/await ile hata işleme
    suspend fun safeAsyncCall() = coroutineScope {
        val deferred = async {
            throw Exception("Async hatası")
            "Async sonucu"
        }
    
        try {
            val result = deferred.await()
            println("Sonuç: $result")
        } catch (e: Exception) {
            println("async'ten yakalanan istisna: ${e.message}")
        }
    }
    

    Bu, her bir asenkron görevin hatalarını seçici olarak işlemenize olanak tanır.

Yöntem Amaç Yakalar uncaught? Yayılımı değiştirir mi?
try...catch Mevcut coroutine içindeki istisnaları işleme Hayır Hayır
CoroutineExceptionHandler Scope içindeki yakalanmamış istisnaları yakalama Evet Hayır
SupervisorJob/Scope İstisna yayılım davranışını değiştirme Hayır Evet
Yapılandırılmış eşzamanlılık Hata durumunda otomatik iptal Evet Evet
async + await() Ertelenmiş istisna yayılımı Hayır Evet (await öncesi)