Junior — Middle
Vai async izpilde tiks izdzēsta, ja tajā ir launch un notiek izņēmums?
sobes.tech AI
Atbilde no AI
Kotlin Coroutines iekšienē, ja async blokā tiek uzsākta korutīna ar launch, tad launch izraisītā izņēmuma nepārtrauks automātiski async izpildi.
Iemesls ir tas, ka async un launch rada dažādas korutīnas ar dažādiem kļūdu apstrādes mehānismiem:
asyncatgriežDeferred, un iekšējās kļūdas tiks pārraidītas, izsaucotawait().launchuzsāk korutīnu, kas nesniedz rezultātu, un tās izņēmumi tiek apstrādāti arCoroutineExceptionHandlervai noved pie vecāka korutīnas atcelšanas.
Ja launch tiek uzsākts async iekšienē bez skaidras saistības ar tā Job, tad launch izņēmums neapturēs async. Lai nodrošinātu atcelšanu, launch jāuzsāk tajā pašā CoroutineScope vai jāizmanto SupervisorJob, vai jāapstrādā kļūdas tieši.
Piemērs:
val deferred = async {
launch {
izsauc Exception("Kļūda launch" )
}
// `async` turpinās
}
// `launch` izņēmums neietekmēs `deferred`, kamēr netiks izsaukts `await()`