Ҳангоми рух додани истисно, чӣ мешавад бо корутин?
sobes.tech AI
Ҷавоб аз AI
Ҳангоми пайдо шудани истисно дар дохили корутин, вобаста ба навъи истисно (ва танзимоти dispatcher/контекст) муайян мешавад, ки чӣ гуна онро баррасӣ кардан мумкин аст.
-
Истиснои бе назорат: Агар истисно дар дохили корутин дастгирӣ нашуда бошад, он ба боло дар хирархияи корутинҳо интиқол дода мешавад то ба
Job(ёCoroutineScope) наздиктарин. Ҳаводис вобаста ба навъи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 оварда мерасонд.