Sobes.tech
Junior — Middle

Корутина ичиндеги каталарды иштетүүдө 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 глобалдык жана каталардын иштетилбеген учурларында лог жүргүзүү же башка аракеттер үчүн колдонулат.