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:
asyncgrąžinaDeferredir klaidos jo viduje bus perduotos, kai bus iškviestasawait().launchpradeda coroutine, kuri negrąžina rezultatų, ir klaidos joje yra tvarkomos perCoroutineExceptionHandlerarba 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()`