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:
asynczwracaDeferred, a błędy w nim będą propagowane podczas wywołaniaawait().launchuruchamia 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()