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:
asyncvracíDeferreda chyby uvnitř něj budou předány při voláníawait().launchspouští coroutine, která nevrací výsledek, a chyby v ní jsou zpracovávány přesCoroutineExceptionHandlernebo 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()`