Sobes.tech
Junior — Middle

Wird die Ausführung von async abgebrochen, wenn darin ein launch enthalten ist und eine Ausnahme auftritt?

sobes.tech KI

Antwort von AI

In Kotlin Coroutines, wenn innerhalb eines async-Blocks eine Coroutine mit launch gestartet wird, wird die in launch auftretende Ausnahme nicht automatisch die Ausführung von async abbrechen.

Der Grund ist, dass async und launch unterschiedliche Coroutines mit unterschiedlichen Fehlerbehandlungsmechanismen erstellen:

  • async gibt ein Deferred zurück und Fehler darin werden beim Aufruf von await() propagiert.
  • launch startet eine Coroutine, die kein Ergebnis zurückgibt, und Ausnahmen darin werden entweder durch CoroutineExceptionHandler behandelt oder führen zur Abbruch der übergeordneten Coroutine.

Wenn launch innerhalb von async ohne explizite Verknüpfung mit seinem Job gestartet wird, wird die Ausnahme in launch async nicht abbrechen. Um dies zu gewährleisten, sollte launch im selben CoroutineScope gestartet werden oder SupervisorJob verwendet werden, oder Fehler explizit behandelt werden.

Beispiel:

val deferred = async {
    launch {
        throw Exception("Fehler in launch")
    }
    // async-Ausführung setzt sich fort
}

// Ausnahme aus launch beeinflusst `deferred` nicht, solange `await()` nicht aufgerufen wird