Sobes.tech
Junior — Middle

İçinde launch bulunan ve istisna oluşan bir durumda async yürütmesi iptal edilecek mi?

sobes.tech yapay zeka

AI'dan gelen yanıt

Kotlin Coroutines içinde, async bloğu içinde launch kullanılarak başlatılan bir coroutine'de, launch içinde oluşan istisna otomatik olarak async'in yürütülmesini iptal etmez.

Bunun nedeni, async ve launch'ın farklı hata yönetimi mekanizmalarına sahip farklı coroutine'lar oluşturmasıdır:

  • async, bir Deferred döner ve içindeki hatalar await() çağrıldığında iletilir.
  • launch, sonuç döndürmeyen bir coroutine başlatır ve içindeki istisnalar CoroutineExceptionHandler aracılığıyla veya ana coroutine'in iptaline yol açar.

Eğer launch, açıkça onun Job'u ile bağlanmadan async içinde başlatılırsa, launch içindeki istisna async'i iptal etmez. İptali sağlamak için, launch aynı CoroutineScope içinde başlatılmalı veya SupervisorJob kullanılmalı veya hatalar açıkça işlenmelidir.

Örnek:

val deferred = async {
    launch {
        throw Exception("launch'ta hata")
    }
    // async devam eder
}

// launch'tan gelen istisna, `await()` çağrılmadıkça `deferred`'i etkilemez