Kas nutinka korutinai, kai įvyksta išimtis?
sobes.tech AI
Atsakymas iš AI
Kai korutinoje įvyksta išimtis, jos tvarkymas priklauso nuo išimties tipo (ir dispečerio/konteksto nustatymų).
-
Nevaldomas išimtis: Jei išimtis nebuvo pagauta korutinoje, ji kyla aukštyn per korutinų hierarchiją iki artimiausio
Job(arbaCoroutineScope). Elgsena priklauso nuoJobtipo:Job: Pagal numatytuosius nustatymus, jei įvyksta išimtis vaikų korutinoje, tėvinisJobatšaukiamas, kas sukelia visų kitų jo vaikų korutinų atšaukimą. Išimtis perduodama aukštyn.SupervisorJob:SupervisorJobnebus atšauktas, jei įvyksta išimtis vaikų korutinoje. Tik ta korutina, kurioje įvyko išimtis, bus atšaukta. Tai naudinga, kai norima, kad vieno vaiko užduoties atšaukimas neturėtų įtakos kitoms.- Pagrindinis
CoroutineScope: Jei išimtis pasiekia pagrindinįCoroutineScope(pvz.,GlobalScopearbaCoroutineScopesukurtą beJob), ji perduodama į globalųCoroutineExceptionHandler. Pagal numatytuosius nustatymus, jei nėra registruoto tvarkytojo, išimtis įrašoma įSystem.err.
-
Pagauta išimtis: Jei išimtis buvo pagauta naudojant
try-catchbloką korutinoje, ji apdorojama vietoje, ir korutina tęsia veiklą pocatchbloko, jei tai įmanoma. Išimtis nėra perduodama aukštyn. -
Išimtys, susijusios su atšaukimu (pvz.,
CancellationException): Šios išimtys yra ypatingos. Jos naudojamos korutinų atšaukimo mechanizmui ir dažniausiai ignoruojamos daugumos išimtis apdorotojų pagal numatytuosius nustatymus. Jos nesukelia lemiamos klaidos tėvinioJobatžvilgiu. -
async-o išimtys: Korutina, paleista perasync, įdeda išimtį į savoDeferred. Išimtis perduodama tik iškvietus.await()ant šioDeferred. Iki to momento išimtis yra "paslėpta".
import kotlinx.coroutines.*
fun main() = runBlocking {
val scope = CoroutineScope(SupervisorJob())
scope.launch {
try {
println("Korutina 1 pradėta")
delay(100)
throw RuntimeException("Kažkas nepavyko Korutinoje 1")
} catch (e: Exception) {
println("Pagauta išimtis Korutinoje 1: ${e.message}")
}
}
scope.launch {
println("Korutina 2 pradėta")
delay(500)
println("Korutina 2 baigta")
}
delay(1000) // Laukiame rezultatų
scope.cancel() // Atšaukiame scope
}
Šiame pavyzdyje, išimtis Korutinoje 1 yra pagauta, ir Korutina 2 tęsia darbą, nes naudojamas SupervisorJob. Jei būtų naudojamas įprastas Job, išimtis Korutinoje 1 sukeltų Korutinos 2 atšaukimą.