Sobes.tech
Junior — Middle

Kuo skiriasi klaidų tvarkymas korutinose naudojant try/catch konstrukciją nuo CoroutineExceptionHandler naudojimo?

sobes.tech AI

Atsakymas iš AI

Kotlin'e, klaidų tvarkymas korutinėse gali būti atliekamas dviem būdais: naudojant try/catch pačiame korutinės viduje ir naudojant CoroutineExceptionHandler.

  • try/catch korutinės viduje leidžia lokalizuotai sugauti išimtis, kurios įvyksta korutinės kodo bloke. Tai naudinga, kai norite tiesiogiai tvarkyti klaidą ten, kur ji gali įvykti.

  • CoroutineExceptionHandler yra globalus išimčių tvarkytojas, skirtas korutinėms, kurios baigiasi klaida ir nėra sugautos vietoje. Jis veikia tik su launch pradėtomis korutinėmis (kurios grąžina Job), o ne su async (kurios grąžina Deferred), nes async reikalauja aiškaus await iškvietimo rezultatui gauti ir klaidų tvarkymui.

Pavyzdys:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Korutinos išimties tvarkytojuje sugauta klaida: $exception")
}

GlobalScope.launch(handler) {
    try {
        // Kodas, kuris gali išmesti išimtį
        throw RuntimeException("Klaida korutinėje")
    } catch (e: Exception) {
        println("Vietoje sugauta: $e")
    }
}

Jei išimtis sugauta try/catch, CoroutineExceptionHandler neveiks. Jei išimtis nėra sugauta vietoje, ji bus perduota CoroutineExceptionHandler. Taip try/catch užtikrina vietinį tvarkymą, o CoroutineExceptionHandler — globalų ir naudojamas logavimui ar kitoms veikloms neapdorotų išimčių atveju.