Sobes.tech
Middle

Ҳангоми рух додани истисно, чӣ мешавад бо корутин?

sobes.tech AI

Ҷавоб аз AI

Ҳангоми пайдо шудани истисно дар дохили корутин, вобаста ба навъи истисно (ва танзимоти dispatcher/контекст) муайян мешавад, ки чӣ гуна онро баррасӣ кардан мумкин аст.

  • Истиснои бе назорат: Агар истисно дар дохили корутин дастгирӣ нашуда бошад, он ба боло дар хирархияи корутинҳо интиқол дода мешавад то ба JobCoroutineScope) наздиктарин. Ҳаводис вобаста ба навъи Job:

    • Job: Дар ҳолати пешфарз, агар дар корутин кӯдакии истисно пайдо шавад, Job-и падарӣ бекор мешавад, ки ба бекор шудани ҳамаи корутинҳои кӯдакии дигар оварда мерасонад. Истисно ба боло интиқол дода мешавад.
    • SupervisorJob: SupervisorJob дар ҳолати пайдо шудани истисно дар корутин кӯдакии худ бекор намешавад. Танҳо корутин, ки дар он истисно рух додааст, бекор мешавад. Ин барои ҳолате муфид аст, ки бекор кардани як вазифаи кӯдакии дигар таъсир накунад.
    • CoroutineScope асосӣ: Агар истисно ба CoroutineScope асосӣ (масалан, GlobalScope ё scope, ки бо CoroutineScope бе Job сохта шудааст) расад, он ба CoroutineExceptionHandler глобалӣ интиқол дода мешавад. Дар ҳолати пешфарз, агар ҳеҷ обработчие сабт нашуда бошад, истисно дар System.err сабт мешавад.
  • Истиснои дастгиришуда: Агар истисно бо истифода аз блоки try-catch дар дохили корутин дастгирӣ шавад, он маҳаллӣ баррасӣ мешавад ва корутин пас аз блоки catch идома меёбад, агар имконпазир бошад. Истисно ба боло интиқол дода намешавад.

  • Истисноҳое, ки бо бекоршавӣ алоқаманданд (масалан, CancellationException): Ин истисноҳо махсусанд. Онҳо барои механизмҳои бекоршавии корутинҳо истифода мешаванд ва одатан аз ҷониби бештари обработчикҳои истисно дар ҳолати пешфарз нодида гирифта мешаванд. Онҳо ба қатъии фаталӣ дар Job-и падарӣ оварда намерасонанд.

  • Истисноҳо дар async: Корутин, ки бо async оғоз ёфтааст, истисноро дар Deferred-и худ ҷойгир мекунад. Ин истисно танҳо дар вақти даъвати .await() дар Deferred интиқол дода мешавад. То он вақт, истисно "пинҳон" мемонад.

import kotlinx.coroutines.*

fun main() = runBlocking {
    val scope = CoroutineScope(SupervisorJob())

    scope.launch {
        try {
            println("Корутин 1 оғоз шуд")
            delay(100)
            throw RuntimeException("Намебоии дар Корутин 1")
        } catch (e: Exception) {
            println("Истиснои дастгиришуда дар Корутин 1: ${e.message}")
        }
    }

    scope.launch {
        println("Корутин 2 оғоз шуд")
        delay(500)
        println("Корутин 2 анҷом ёфт")
    }

    delay(1000) // Мутобиқсозӣ барои дидани натиҷа
    scope.cancel() // Бекор кардани scope
}

Дар ин мисол, истисно дар Корутин 1 дастгирӣ мешавад ва Корутин 2 идома мекунад, зеро SupervisorJob истифода шудааст. Агар ба ҷои он Job оддӣ истифода мешуд, истисно дар Корутин 1 ба бекор шудани Корутин 2 оварда мерасонд.