Sobes.tech
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:

  • async atgriež Deferred, un iekšējās kļūdas tiks pārraidītas, izsaucot await().
  • launch uzsāk korutīnu, kas nesniedz rezultātu, un tās izņēmumi tiek apstrādāti ar CoroutineExceptionHandler vai 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()`