Sobes.tech
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:

  • async returnează un Deferred și erorile din interiorul său vor fi propagate la apelarea await().
  • launch porneș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()`