Sobes.tech
Junior — Middle

Ar async vykdymas bus atšauktas, jei jame yra launch ir įvyksta išimtis?

sobes.tech AI

Atsakymas iš AI

Kotlin Coroutines, jei async bloko viduje yra pradėta coroutine naudojant launch, iš launch atsiradęs išimtis nepakeis automatiškai async vykdymo.

Priežastis ta, kad async ir launch kuria skirtingas coroutine su skirtingais klaidų valdymo mechanizmais:

  • async grąžina Deferred ir klaidos jo viduje bus perduotos, kai bus iškviestas await().
  • launch pradeda coroutine, kuri negrąžina rezultatų, ir klaidos joje yra tvarkomos per CoroutineExceptionHandler arba sukelia tėvinės coroutine atšaukimą.

Jei launch yra pradėta async viduje be aiškios ryšio su jos Job, klaida launch nebus automatiškai atšaukta async. Norint užtikrinti atšaukimą, launch turi būti pradėta tame pačiame CoroutineScope arba naudoti SupervisorJob, arba aiškiai tvarkyti klaidas.

Pavyzdys:

val deferred = async {
    launch {
        throw Exception("Klaida launch'e")
    }
    // `async` vykdymas tęsiasi
}

// `launch` klaida nepaveiks `deferred`, kol nebus iškviestas `await()`