Sobes.tech
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ć CoroutineExceptionHandler podczas 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łania await().

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.