Sobes.tech
Junior — Middle

Bude vykonání async zrušeno, pokud je uvnitř něj launch a dojde k výjimce?

sobes.tech AI

Odpověď od AI

V Kotlin Coroutines, pokud v bloku async spustíte coroutine pomocí launch, pak chyba, která vznikne v launch, automaticky nezruší provádění async.

Důvodem je, že async a launch vytvářejí různé coroutines s různými mechanismy pro zpracování chyb:

  • async vrací Deferred a chyby uvnitř něj budou předány při volání await().
  • launch spouští coroutine, která nevrací výsledek, a chyby v ní jsou zpracovávány přes CoroutineExceptionHandler nebo vedou ke zrušení nadřazené coroutine.

Pokud je launch spuštěn uvnitř async bez explicitního spojení s jeho Job, chyba v launch nezruší async. Aby bylo zajištěno zrušení, je třeba spustit launch ve stejném CoroutineScope nebo použít SupervisorJob, nebo explicitně zpracovat chyby.

Příklad:

val deferred = async {
    launch {
        throw Exception("Chyba v launch")
    }
    // provádění async bude pokračovat
}

// Výjimka z launch neovlivní deferred, dokud nebude voláno `await()`