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