Junior — Middle
Se va anula executarea async dacă în interiorul acesteia există un launch și apare o excepție?
sobes.tech AI
Răspuns de la AI
În Kotlin Coroutines, dacă în interiorul unui bloc async se pornește o coroutine prin launch, excepția apărută în launch nu va anula automat execuția lui async.
Motivul este că async și launch creează corutine diferite cu mecanisme diferite de gestionare a erorilor:
asyncreturnează unDeferredși erorile din interiorul său vor fi propagate la apelareaawait().launchpornește o coroutine care nu returnează rezultat, iar excepțiile din ea sunt gestionate prin CoroutineExceptionHandler sau duc la anularea coroutinei părinte.
Dacă launch este pornit în interiorul lui async fără o legătură explicită cu Job-ul său, excepția în launch nu va anula async. Pentru a asigura anularea, trebuie să porniți launch în același CoroutineScope sau să folosiți SupervisorJob, sau să tratați erorile explicit.
Exemplu:
val deferred = async {
launch {
arunca Exception("Eroare în launch")
}
// execuția lui async va continua
}
// Excepția din launch nu va afecta `deferred`, până nu se apelează `await()`