Junior — Middle
Jak obsługiwać wyjątki podczas uruchamiania korutyn za pomocą try/catch, umieszczone poza funkcją launch?
sobes.tech AI
Odpowiedź od AI
W Kotlinie, wyjątki występujące wewnątrz korutyn nie mogą być złapane zwykłym try/catch, jeśli są umieszczone poza funkcją launch, ponieważ launch uruchamia korutynę asynchronicznie i od razu zwraca obiekt Job, a wyjątki już występują w innym kontekście.
Aby obsłużyć wyjątki, należy używać obsługiwaczy wewnątrz korutyny lub specjalnych mechanizmów:
- Używać
CoroutineExceptionHandlerpodczas tworzenia kontekstu korutyny. - Obsługiwać wyjątki wewnątrz samej korutyny za pomocą try/catch.
- Dla korutyn uruchamianych przez
async, można złapać wyjątek podczas wywołaniaawait().
Przykład z CoroutineExceptionHandler:
val handler = CoroutineExceptionHandler { _, exception ->
println("Złapano wyjątek: ${exception.message}")
}
val job = CoroutineScope(Dispatchers.Default + handler).launch {
throw RuntimeException("Błąd w korutynie")
}
job.join()
W ten sposób, try/catch poza launch nie zadziała, trzeba go złapać wewnątrz korutyny lub użyć CoroutineExceptionHandler.