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