Sobes.tech
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 launch wystą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 async nie są rzucane od razu, lecz odłożone do wywołania await(). Jeśli await() 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.