Sobes.tech
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 async egy Deferred-t ad vissza, és a benne lévő hibák akkor lesznek átadva, amikor az await()-et hívják.
  • A launch egy 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