Sobes.tech
Junior — Middle

Wordt de uitvoering van async geannuleerd als er binnenin een launch is en er een uitzondering optreedt?

sobes.tech AI

Antwoord van AI

In Kotlin Coroutines, als binnen een async-blok een coroutine wordt gestart via launch, zal de uitzondering die in launch optreedt niet automatisch de uitvoering van async annuleren.

De reden is dat async en launch verschillende coroutines creëren met verschillende foutafhandelingsmechanismen:

  • async geeft een Deferred terug en fouten daarin worden doorgegeven bij het aanroepen van await().
  • launch start een coroutine die geen resultaat retourneert, en fouten daarin worden afgehandeld via CoroutineExceptionHandler of leiden tot het annuleren van de bovenliggende coroutine.

Als launch binnen async wordt gestart zonder expliciete koppeling aan zijn Job, zal de uitzondering in launch async niet annuleren. Om annulering te garanderen, moet launch worden gestart in dezelfde CoroutineScope of gebruik maken van SupervisorJob, of fouten expliciet afhandelen.

Voorbeeld:

val deferred = async {
    launch {
        throw Exception("Fout in launch")
    }
    // async gaat door
}

// Uitzondering uit launch beïnvloedt `deferred` niet totdat `await()` wordt aangeroepen