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 глобалӣ аст ва барои сабт ё дигар амалҳо дар ҳолати хатогиҳои беҷавоб истифода мешавад.