Sobes.tech
Junior — Middle

Kaip tvarkyti išimtis paleidžiant korutinas naudojant try/catch, kuris yra išdėstytas už launch funkcijos ribų?

sobes.tech AI

Atsakymas iš AI

Kotlin-ə, korutinlər daxilində baş verən istisnalar dışında yerləşdirilmiş launch funksiyasından kənarda adi try/catch ilə tutulmamaq mümkündür, çünki launch korutini asinxron şəkildə başlayır və dərhal Job obyektini geri qaytarır, və istisnalar artıq başqa kontekstdə baş verir.

İstisnaları idarə etmək üçün, korutin daxilində istifadə olunan idarəedicilər və ya xüsusi mexanizmlər lazımdır:

  • Korutin kontekstinin yaradılmasında CoroutineExceptionHandler istifadə etmək.
  • İstisnaları korutinin içində try/catch ilə işləmək.
  • async-la başlatılan korutinalar üçün, istisnaları çağırış zamanı await() ilə tutmaq mümkündür.

CoroutineExceptionHandler ilə nümunə:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Yakalaşmış istisna: ${exception.message}")
}

val job = CoroutineScope(Dispatchers.Default + handler).launch {
    throw RuntimeException("Korutində xəta")
}

job.join()

Beləliklə, launch-dan kənar try/catch işləməyəcək, onu korutina daxilində tutmaq və ya CoroutineExceptionHandler istifadə etmək lazımdır.