როგორ განსხვავდება შეცდომების მართვა კორუტინების შიგნით, გამოყენებული try/catch კონსტრუქციისგან და CoroutineExceptionHandler-ის გამოყენებისგან?
sobes.tech AI
პასუხი AI-სგან
Kotlin-да, корутиндердеги каталардын иштетилиши эки жол менен жүргүзүлүшү мүмкүн: try/catch аркылуу корутиндин ичинде жана CoroutineExceptionHandler аркылуу.
-
try/catchкорутиндин ичинде корутиндин код бөлүгүндө пайда болгон чыгымдарды жергиликтүү кармоого мүмкүндүк берет. Бул катаны ошол жерде түзөтүү керек болгон учурда пайдалуу. -
CoroutineExceptionHandler— бул глобалдык каталардын иштетүүчүсү, ал каталар менен аяктайт жана жергиликтүү кармалган эмес. Алlaunchменен иштетилген корутиндер менен гана иштейт (аларJobкайтарат), ал эмиasyncменен эмес (аларDeferredкайтарат), анткениasyncнатыйжаны алуу жана каталарды иштетүү үчүн ачыкawaitчакыруусун талап кылат.
Мисал:
val handler = CoroutineExceptionHandler { _, exception ->
println("CoroutineExceptionHandler'де кармалган каталар: $exception")
}
GlobalScope.launch(handler) {
try {
// Катаны чыгара турган код
throw RuntimeException("Корутин ичинде каталар")
} catch (e: Exception) {
println("Жергиликтүү кармалган: $e")
}
}
Эгер каталар try/catch менен кармалса, CoroutineExceptionHandler ишке кирбейт. Эгер каталар жергиликтүү иштетилбесе, ал CoroutineExceptionHandler-ге өтөт. Ошентип, try/catch жергиликтүү иштетүүнү камсыздайт, ал эми CoroutineExceptionHandler глобалдык жана каталардын иштетилбеген учурларында лог жүргүзүү же башка аракеттер үчүн колдонулат.