Junior — Middle
Jakie są różnice w obsłudze błędów między używaniem launch a async/await w korutynach?
sobes.tech AI
Odpowiedź od AI
W Kotlinie launch i async różnią się obsługą błędów:
-
launch: uruchamia korutynę, która nie zwraca wyniku. Jeśli wewnątrz
launchwystąpi wyjątek, jest on przekazywany do CoroutineExceptionHandler lub propagowany w kontekst nadrzędny, co może prowadzić do anulowania nadrzędnej korutyny. -
async: uruchamia korutynę, która zwraca Deferred — opóźniony wynik. Wyjątki wewnątrz
asyncnie są rzucane od razu, lecz odłożone do wywołaniaawait(). Jeśliawait()nie zostanie wywołane, błąd może pozostać niezauważony.
Przykład:
val job = launch {
throw Exception("Błąd w launch")
}
val deferred = async {
throw Exception("Błąd w async")
}
runBlocking {
job.join() // wyjątek zostanie obsłużony tutaj
try {
deferred.await() // wyjątek zostanie wyrzucony tutaj
} catch (e: Exception) {
println("Przechwycony błąd: ${e.message}")
}
}
W ten sposób launch natychmiast sygnalizuje błąd, a async tylko podczas próby uzyskania wyniku.