Sobes.tech
Junior — Middle

Da li će se izvršenje async otkazati ako unutar njega postoji launch i dođe do izuzetka?

sobes.tech АИ

Одговор од АИ

U Kotlin Coroutines, ako unutar async bloka pokrenete korutinu putem launch, izuzetak koji se dogodi u launch neće automatski prekinuti izvršenje async.

Razlog je taj što async i launch kreiraju različite korutine sa različitim mehanizmima za obradu grešaka:

  • async vraća Deferred i greške unutar njega biće prosleđene pri pozivu await().
  • launch pokreće korutinu koja ne vraća rezultat, a izuzeci u njoj se obrađuju putem CoroutineExceptionHandler ili dovode do otkazivanja roditeljske korutine.

Ako je launch pokrenut unutar async bez eksplicitnog povezivanja sa njegovim Job, izuzetak u launch neće otkazati async. Da bi se osiguralo otkazivanje, potrebno je pokrenuti launch u istom CoroutineScope ili koristiti SupervisorJob, ili eksplicitno obraditi greške.

Primer:

val deferred = async {
    launch {
        throw Exception("Greška u launch")
    }
    // izvršenje async će se nastaviti
}

// Izuzetak iz launch neće uticati na deferred, dok se ne pozove `await()`