Sobes.tech
Junior — Middle

Kako se razlikuje obrada grešaka unutar korutina korišćenjem konstrukcije try/catch od korišćenja CoroutineExceptionHandler?

sobes.tech АИ

Одговор од АИ

U Kotlinu, obrada grešaka u korutinama može se izvršiti na dva načina: putem try/catch unutar same korutine i putem CoroutineExceptionHandler.

  • try/catch unutar korutine omogućava lokalno hvatanje izuzetaka koji se javljaju u kod bloku korutine. Ovo je korisno kada želite da obradite grešku direktno tamo gde može da se dogodi.

  • CoroutineExceptionHandler je globalni upravljač izuzetaka za korutine koje se završavaju greškom i nisu lokalno uhvaćene. Radi samo sa korutinama pokrenutim sa launch (koje vraćaju Job), a ne sa async (koje vraćaju Deferred), jer async zahteva eksplicitni poziv await za dobijanje rezultata i obradu izuzetaka.

Primer:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Uhvaćen izuzetak u CoroutineExceptionHandler: $exception")
}

GlobalScope.launch(handler) {
    try {
        // Kod koji može da baci izuzetak
        throw RuntimeException("Greška unutar korutine")
    } catch (e: Exception) {
        println("Lokalno uhvaćeno: $e")
    }
}

Ako je izuzetak uhvaćen u try/catch, CoroutineExceptionHandler se neće aktivirati. Ako izuzetak nije lokalno obrađen, biće prosleđen CoroutineExceptionHandler. Na ovaj način, try/catch obezbeđuje lokalnu obradu, dok je CoroutineExceptionHandler globalni i služi za logovanje ili druge radnje kod neobrađenih izuzetaka.