Aké spôsoby spracovania chýb v korutinách poznáte?
sobes.tech AI
Odpoveď od AI
-
Použitie
try...catchblokov. Štandardný spôsob spracovania výnimiek. Funguje vo vnútri korutiny.// Použitie try-catch suspend fun fetchData(): String { return try { // Operácia, ktorá môže vyhodiť výnimku throw Exception("Chyba pri načítaní dát") "Dáta úspešne načítané" } catch (e: Exception) { "Chyba: ${e.message}" } }try...catchnie je vhodný na spracovanie nechytených výnimiek, ktoré sú vyhodené z dcérskych korútín, spustených v inomCoroutineScope. -
CoroutineExceptionHandler. Zachytáva neopracované výnimky, ktoré sú vyhodené korutínami, ktoré sú spustené v tomtoCoroutineScopealebo v jeho dcérskychCoroutineScope.// CoroutineExceptionHandler val handler = CoroutineExceptionHandler { _, exception -> println("Zachytená výnimka: $exception") } // Použitie CoroutineExceptionHandler GlobalScope.launch(handler) { // Korutína, ktorá môže vyhodiť výnimku throw Exception("Chyba v korutíne") }CoroutineExceptionHandlersa aktivuje iba pre výnimky, ktoré nie sú spracované mechanizmom štruktúrovanej konkurencie. -
SupervisorJobasupervisorScope. Na rozdiel od obyčajnéhoJob, keď dcérska korutína s chybou vedie k zrušeniu rodičovskéhoJob,SupervisorJobnezruší rodičovskýJobpri chybe dcérskej korutiny.supervisorScopevytváraCoroutineScopesSupervisorJob.// Použitie supervisorScope suspend fun loadMultipleData() = supervisorScope { val data1 = async { // Môže vyhodiť výnimku throw Exception("Chyba v dátach 1") "Dáta 1" } val data2 = async { "Dáta 2" } // Môže spracovať výnimku pre konkrétnu async try { println("Výsledok 1: ${data1.await()}") } catch (e: Exception) { println("Chyba pri načítaní dát 1: ${e.message}") } println("Výsledok 2: ${data2.await()}") }Používa sa pre nezávislé dcérske úlohy, kde chyba jednej nemá ovplyvniť ostatné. Nezamení
try...catchaleboCoroutineExceptionHandler, ale mení správanie šírenia výnimiek. -
Šírenie výnimiek v štruktúrovanej konkurencii. Podľa predvolenej konfigurácie, výnimka v dcérskej korutíne zruší rodičovskú korutínu a všetkých jej súrodencov.
// Príklad šírenia výnimky runBlocking { val job = launch { launch { // Dcérska korutína 1 delay(100) throw Exception("Chyba v dcérskej 1") } launch { // Dcérska korutína 2 delay(200) println("Dcérska 2 skončila") } } try { job.join() } catch (e: Exception) { println("Zachytená výnimka v rodičovi: $e") } }Toto je základné správanie štruktúrovanej konkurencie, ktoré pomáha predchádzať únikom zdrojov a stavov.
-
Použitie
asyncsawait(). Výnimky, vyhodené vasync, ne sa automaticky šíria. Sú uložené vo vnútriDeferreda vyhadzujú sa iba pri volaníawait().// Spracovanie výnimiek s async/await suspend fun safeAsyncCall() = coroutineScope { val deferred = async { throw Exception("Chyba v async") "Výsledok async" } try { val result = deferred.await() println("Výsledok: $result") } catch (e: Exception) { println("Zachytená výnimka z async: ${e.message}") } }To umožňuje selektívne spracovanie chýb pre každú asynchrónnu úlohu.
| Spôsob | Účel | Spracováva nechytené? | Mení šírenie? |
|---|---|---|---|
try...catch |
Spracovanie výnimiek v aktuálnej korutine | Nie | Nie |
CoroutineExceptionHandler |
Zachytáva neopracované výnimky v Scope | Áno | Nie |
SupervisorJob/Scope |
Zmena správania šírenia výnimiek | Nie | Áno |
| Štruktúrovaná konkurencia | Automatické zrušenie pri chybe | Áno | Áno |
async + await() |
Odložené šírenie výnimky | Nie | Áno (do await) |