Sobes.tech
Junior — Middle

Czym różni się obsługa błędów w korutynach za pomocą konstrukcji try/catch od użycia CoroutineExceptionHandler?

sobes.tech AI

Odpowiedź od AI

W Kotlinie obsługa błędów w korutynach może odbywać się na dwa sposoby: za pomocą try/catch wewnątrz samej korutyny oraz za pomocą CoroutineExceptionHandler.

  • try/catch wewnątrz korutyny pozwala lokalnie przechwytywać wyjątki występujące w bloku kodu korutyny. Jest to wygodne, gdy chcemy obsłużyć błąd dokładnie tam, gdzie może się pojawić.

  • CoroutineExceptionHandler to globalny obsługiwacz wyjątków dla korutyn kończących się błędem i nieprzechwyconych lokalnie. Działa tylko z korutynami uruchomionymi za pomocą launch (zwracającymi Job), a nie z async (zwracającymi Deferred), ponieważ async wymaga jawnego wywołania await do pobrania wyniku i obsługi wyjątków.

Przykład:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Przechwycono wyjątek w CoroutineExceptionHandler: $exception")
}

GlobalScope.launch(handler) {
    try {
        // Kod, który może rzucić wyjątek
        throw RuntimeException("Błąd w korutynie")
    } catch (e: Exception) {
        println("Lokalnie przechwycono: $e")
    }
}

Jeśli wyjątek zostanie przechwycony w try/catch, CoroutineExceptionHandler nie zadziała. Jeśli wyjątek nie zostanie obsłużony lokalnie, trafi do CoroutineExceptionHandler. W ten sposób try/catch zapewnia lokalne obsługiwanie, a CoroutineExceptionHandler jest globalny i służy do logowania lub innych działań przy nieobsłużonych wyjątkach.