Sobes.tech
Junior — Middle

Ako sa líši spracovanie chýb v rámci korutín pomocou konštrukcie try/catch od použitia CoroutineExceptionHandler?

sobes.tech AI

Odpoveď od AI

V Kotlinu môže byť spracovanie chýb v korutinách vykonané dvoma spôsobmi: pomocou try/catch vo vnútri samotnej korutiny a pomocou CoroutineExceptionHandler.

  • try/catch vo vnútri korutiny umožňuje lokálne zachytiť výnimky, ktoré vzniknú v bloku kódu korutiny. Je to užitočné, keď chcete spracovať chybu priamo tam, kde môže nastať.

  • CoroutineExceptionHandler je globálny správca výnimiek pre korutiny, ktoré skončia chybou a neboli zachytené lokálne. Funguje iba s korutinami spustenými pomocou launch (ktoré vracajú Job), nie s async (ktoré vracajú Deferred), pretože async vyžaduje explicitné volanie await na získanie výsledku a spracovanie výnimiek.

Príklad:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Zachytená výnimka v CoroutineExceptionHandler: $exception")
}

GlobalScope.launch(handler) {
    try {
        // Kód, ktorý môže vyvolať výnimku
        throw RuntimeException("Chyba v korutine")
    } catch (e: Exception) {
        println("Lokálne zachytené: $e")
    }
}

Ak je výnimka zachytená v try/catch, CoroutineExceptionHandler sa neaktivuje. Ak výnimka nie je lokálne spracovaná, bude odoslaná do CoroutineExceptionHandler. Týmto spôsobom try/catch zabezpečuje lokálne spracovanie, zatiaľ čo CoroutineExceptionHandler je globálny a slúži na logovanie alebo iné akcie pri nezachytených výnimkách.