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:
asyncvraćaDeferredi greške unutar njega biće prosleđene pri pozivuawait().launchpokreće korutinu koja ne vraća rezultat, a izuzeci u njoj se obrađuju putemCoroutineExceptionHandlerili 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()`