Sobes.tech
Middle

Jakie są różnice między launch a async w kontekście obsługi błędów?

sobes.tech AI

Odpowiedź od AI

W launch błędy rozprzestrzeniają się bezpośrednio na kontekst nadrzędnego coroutine, co powoduje awarię aplikacji, jeśli nie są obsłużone. W async błędy są odłożone i pojawiają się tylko podczas wywołania .await().

Na przykład:

fun main() = runBlocking {
    // launch: błąd powoduje awarię scope
    val job = launch {
        throw IllegalStateException("Błąd w launch")
    }
    job.join() // Czeka na zakończenie job, w przypadku błędu job zostanie anulowany

    // async: błąd jest odłożony do momentu await
    val deferred = async {
        throw IllegalStateException("Błąd w async")
        "Wynik" // Ten kod nie zostanie wykonany
    }
    try {
        deferred.await() // Tu zostanie rzucony odłożony błąd
    } catch (e: IllegalStateException) {
        println("Przechwycono błąd: ${e.message}")
    }
}