Junior — Middle
A végrehajtás async megszakad, ha benne van egy launch és kivétel történik?
sobes.tech MI
Válasz az MI-től
A Kotlin Coroutines-ban, ha egy async blokkban launch segítségével indítunk egy coroutine-t, akkor a launch-ban keletkező kivétel nem fog automatikusan megszakítani az async végrehajtását.
Ennek oka, hogy az async és a launch különböző coroutine-okat hoznak létre különböző hibakezelési mechanizmusokkal:
- Az
asyncegyDeferred-t ad vissza, és a benne lévő hibák akkor lesznek átadva, amikor azawait()-et hívják. - A
launchegy olyan coroutine-t indít, amely nem ad eredményt, és a benne lévő kivételek a CoroutineExceptionHandler segítségével kezelhetők vagy a szülő coroutine megszakadásához vezetnek.
Ha a launch az async-en belül indul, anélkül, hogy egyértelműen összekapcsolnánk a Job-jával, akkor a launch-ban keletkező kivétel nem fogja megszakítani az async-t. A megszakítás biztosításához ugyanabban a CoroutineScope-ban kell indítani a launch-t, vagy SupervisorJob-ot kell használni, vagy explicit módon kezelni a hibákat.
Példa:
val deferred = async {
launch {
throw Exception("Hiba a launch-ben")
}
// az async folytatódik
}
// A launch-ból származó kivétel nem befolyásolja a deferred-et, amíg nem hívják az `await()`-et