Sobes.tech
Junior — Middle

Czy wykonanie async zostanie anulowane, jeśli w nim znajduje się launch i wystąpi wyjątek?

sobes.tech AI

Odpowiedź od AI

W Kotlin Coroutines, jeśli wewnątrz bloku async uruchomiona jest coroutine za pomocą launch, wyjątek występujący w launch nie spowoduje automatycznego anulowania wykonania async.

Powód jest taki, że async i launch tworzą różne korutyny z różnymi mechanizmami obsługi błędów:

  • async zwraca Deferred, a błędy w nim będą propagowane podczas wywołania await().
  • launch uruchamia korutynę, która nie zwraca wyniku, a wyjątki w niej obsługiwane są przez CoroutineExceptionHandler lub prowadzą do anulowania nadrzędnej korutyny.

Jeśli launch jest uruchomione wewnątrz async bez wyraźnego powiązania z jego Job, wyjątek w launch nie anuluje async. Aby zapewnić anulowanie, należy uruchomić launch w tym samym CoroutineScope lub użyć SupervisorJob albo obsługiwać błędy jawnie.

Przykład:

val deferred = async {
    launch {
        throw Exception("Błąd w launch")
    }
    // wykonanie async będzie kontynuowane
}

// Wyjątek z launch nie wpłynie na deferred, dopóki nie zostanie wywołane await()