Xatolik yuzaga kelganda korutina bilan nima bo'ladi?
sobes.tech AI
AIdan javob
Bir korutina ichida istisno yuzaga kelganda, istisno turiga (va dispatcher/kontekst sozlamalariga) bog‘liq holda, uning qanday ishlashini belgilaydi.
-
Boshqarilmaydigan istisno: Agar istisno korutina ichida ushlanmasa, u yaqin
JobyokiCoroutineScopega yuqoriga tarqaladi. Xulq-atvorJobturiga bog‘liq:Job: Standart holatda, bolalar korutinasida istisno yuzaga kelganda, otaJobbekor qilinadi, bu esa uning barcha bolalar korutinalarining bekor qilinishiga olib keladi. Istisno yuqoriga tarqaladi.SupervisorJob: OtaSupervisorJobbolalar korutinasida istisno yuzaga kelganda bekor qilinmaydi. Faqat istisno yuzaga kelgan korutina bekor qilinadi. Bu, bir bolalar vazifasining bekor qilinishi boshqalarga ta'sir qilmasligini istaganingizda foydalidir.CoroutineScopeasosiy: Agar istisno asosiyCoroutineScopega (masalan,GlobalScopeyokiJobsiz yaratilgan scope) yetib borsa, u globalCoroutineExceptionHandlerga uzatiladi. Standart holatda, agar ro‘yxatga olingan handler bo‘lmasa, istisnoSystem.errda loglanadi.
-
Ushlangan istisno: Agar istisno
try-catchbloki yordamida korutina ichida ushlansa, u lokal tarzda ishlanadi va korutinacatchblokidan keyin davom etadi, agar bu mumkin bo‘lsa. Istisno yuqoriga tarqalmaydi. -
Bekor qilish bilan bog‘liq istisnolar (masalan,
CancellationException): Bu istisnolar maxsus. Ular korutinalarni bekor qilish mexanizmi uchun ishlatiladi va odatda, ko‘pchilik istisno ishlovchilar tomonidan e'tiborsiz qoldiriladi. Ular odatda otaJobning halokatli xatosiga olib kelmaydi. -
asyncda istisnolar:asyncyordamida ishga tushirilgan korutina, istisnoni o‘ziningDeferredga joylashtiradi. Istisno faqat.await()chaqirilganda tarqaladi. Bu vaqtgacha, istisno "yashirilgan".
import kotlinx.coroutines.*
fun main() = runBlocking {
val scope = CoroutineScope(SupervisorJob())
scope.launch {
try {
println("Korutina 1 boshladi")
delay(100)
throw RuntimeException("Nimadir noto‘g‘ri ketdi Korutina 1 da")
} catch (e: Exception) {
println("Korutina 1 da ushlangan istisno: ${e.message}")
}
}
scope.launch {
println("Korutina 2 boshladi")
delay(500)
println("Korutina 2 tugadi")
}
delay(1000) // Natijani ko‘rish uchun kutamiz
scope.cancel() // Scope ni bekor qilamiz
}
Bu misolda, Korutina 1 da yuzaga kelgan istisno ushlanadi va Korutina 2 davom etadi, chunki SupervisorJob ishlatilgan. Agar oddiy Job ishlatilgan bo‘lsa, Korutina 1 da yuzaga kelgan istisno Korutina 2 ning bekor qilinishiga olib kelardi.