Junior — Middle
Bude vykonanie async zrušené, ak je v ňom launch a dôjde k výnimke?
sobes.tech AI
Odpoveď od AI
V Kotlin Coroutines, ak v bloku async spustíte coroutine pomocou launch, výnimka, ktorá vznikne v launch, automaticky neukončí vykonávanie async.
Dôvodom je, že async a launch vytvárajú rôzne coroutine s rôznymi mechanizmami spracovania chýb:
asyncvraciaDeferreda chyby v ňom budú odovzdané pri volaníawait().launchspúšťa coroutine, ktorá nevracia výsledok, a výnimky v nej sú spracovávané cezCoroutineExceptionHandleralebo vedú k zrušeniu nadradenej coroutine.
Ak je launch spustené vnútri async bez explicitného prepojenia s jeho Job, výnimka v launch nezruší async. Aby bolo zabezpečené zrušenie, je potrebné spustiť launch v rovnakom CoroutineScope alebo použiť SupervisorJob, alebo explicitne spracovať chyby.
Príklad:
val deferred = async {
launch {
throw Exception("Chyba v launch")
}
// vykonávanie async bude pokračovať
}
// Výnimka z launch neovplyvní `deferred`, pokiaľ nebude volané `await()`