Sobes.tech
Middle

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 Job yoki CoroutineScope ga yuqoriga tarqaladi. Xulq-atvor Job turiga bog‘liq:

    • Job: Standart holatda, bolalar korutinasida istisno yuzaga kelganda, ota Job bekor qilinadi, bu esa uning barcha bolalar korutinalarining bekor qilinishiga olib keladi. Istisno yuqoriga tarqaladi.
    • SupervisorJob: Ota SupervisorJob bolalar 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.
    • CoroutineScope asosiy: Agar istisno asosiy CoroutineScope ga (masalan, GlobalScope yoki Jobsiz yaratilgan scope) yetib borsa, u global CoroutineExceptionHandler ga uzatiladi. Standart holatda, agar ro‘yxatga olingan handler bo‘lmasa, istisno System.err da loglanadi.
  • Ushlangan istisno: Agar istisno try-catch bloki yordamida korutina ichida ushlansa, u lokal tarzda ishlanadi va korutina catch blokidan 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 ota Job ning halokatli xatosiga olib kelmaydi.

  • async da istisnolar: async yordamida ishga tushirilgan korutina, istisnoni o‘zining Deferred ga 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.