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ącymiJob), a nie zasync(zwracającymiDeferred), ponieważasyncwymaga jawnego wywołaniaawaitdo 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.