Sobes.tech
Junior — Middle

Kotlin korutinlarida xatoliklarni boshqarish try/catch konstruktsiyasidan foydalanish bilan CoroutineExceptionHandlerdan foydalanish o'rtasidagi farq nima?

sobes.tech AI

AIdan javob

Kotlin'da, korutinlardagi xatoliklarni boshqarish ikki usulda amalga oshirilishi mumkin: try/catch yordamida korutin ichida va CoroutineExceptionHandler yordamida.

  • Korutina ichidagi try/catch korutin kod blokida yuzaga keladigan istisnolarni lokal tarzda ushlash imkonini beradi. Bu, xatolik yuzaga keladigan joyda uni to'g'ridan-to'g'ri boshqarish uchun qulay.

  • CoroutineExceptionHandler — bu xatolik bilan yakunlangan va lokal tarzda ushlanmagan korutinlar uchun global xatolik boshqaruvchisidir. U faqat launch bilan boshlatilgan korutinlar bilan ishlaydi (ular Jobni qaytaradi), async bilan emas (ular Deferredni qaytaradi), chunki async natijani olish va xatoliklarni boshqarish uchun aniq await chaqiruvini talab qiladi.

Misol:

val handler = CoroutineExceptionHandler { _, exception ->
    println("CoroutineExceptionHandler'da ushlangan xato: $exception")
}

GlobalScope.launch(handler) {
    try {
        // Xato chiqarishi mumkin bo'lgan kod
        throw RuntimeException("Korutin ichida xato")
    } catch (e: Exception) {
        println("Lokal tarzda ushlangan: $e")
    }
}

Agar xato try/catch bilan ushlansa, CoroutineExceptionHandler ishga tushmaydi. Agar xato lokal tarzda boshqarilmasa, u CoroutineExceptionHandlerga yuboriladi. Shu tarzda, try/catch lokal boshqaruvni ta'minlaydi, CoroutineExceptionHandler esa global bo'lib, boshqarilmagan xatoliklar uchun log yozish yoki boshqa harakatlar uchun xizmat qiladi.