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/catchkorutinė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. -
CoroutineExceptionHandleryra globalus išimčių tvarkytojas, skirtas korutinėms, kurios baigiasi klaida ir nėra sugautos vietoje. Jis veikia tik sulaunchpradėtomis korutinėmis (kurios grąžinaJob), o ne suasync(kurios grąžinaDeferred), nesasyncreikalauja aiškausawaitiš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.