Korutinalarda xatoliklarni boshqarish usullarini bilasizmi?
sobes.tech AI
AIdan javob
-
try...catchbloklaridan foydalanish. Xatoliklarni boshqarishning standart usuli. Korutinalar ichida ishlaydi.// try-catch qoʻllash suspend fun fetchData(): String { return try { // Xatolik chiqarishi mumkin boʻlgan operatsiya throw Exception("Ma'lumotlarni yuklashda xato") "Ma'lumotlar muvaffaqiyatli yuklandi" } catch (e: Exception) { "Xato: ${e.message}" } }try...catchboshqaCoroutineScopeda ishga tushirilgan bolalar korutinalardan chiqarilgan uncaught xatoliklarni boshqarmaydi. -
CoroutineExceptionHandler. Bu korutinalar tomonidan chiqarilgan va boshqarilmagan xatoliklarni ushlaydi, agar ular ushbuCoroutineScopeyoki uning bolalarCoroutineScopelarida ishga tushirilgan boʻlsa.// CoroutineExceptionHandler val handler = CoroutineExceptionHandler { _, exception -> println("Ushlangan xato: $exception") } // CoroutineExceptionHandlerni qoʻllash GlobalScope.launch(handler) { // Xatolik chiqarishi mumkin boʻlgan korutina throw Exception("Korutinadagi xato") }CoroutineExceptionHandlerfaqat strukturali raqobat mexanizmi tomonidan boshqarilmaydigan xatoliklar uchun ishlaydi. -
SupervisorJobvasupervisorScope. OddiyJobdan farqli oʻlaroq, xatolik bilan bolalar korutina otaJobni bekor qilsa,SupervisorJobotaJobni bekor qilmaydi.supervisorScopeSupervisorJobbilanCoroutineScopeyaratadi.// supervisorScope dan foydalanish suspend fun loadMultipleData() = supervisorScope { val data1 = async { // Xatolik chiqarishi mumkin throw Exception("Ma'lumot 1 da xato") "Ma'lumot 1" } val data2 = async { "Ma'lumot 2" } // Aniq bir `async` uchun xatolikni boshqarish mumkin try { println("Natija 1: ${data1.await()}") } catch (e: Exception) { println("Ma'lumot 1 ni yuklashda xato: ${e.message}") } println("Natija 2: ${data2.await()}") }Bu mustaqil bolalar vazifalari uchun ishlatiladi, bunda birining xatosi boshqalarga ta'sir qilmasligi kerak.
try...catchyokiCoroutineExceptionHandlerni o'zgartirmaydi, balki xatoliklarning tarqalishini o'zgartiradi. -
Strukturali raqobatda xatoliklarni tarqatish. Standart holatda, bolalar korutinasida chiqarilgan xato ota korutina va uning singillarini bekor qiladi.
// Xato tarqalishini misol qilish runBlocking { val job = launch { launch { // Bolalar korutina 1 delay(100) throw Exception("Bolalar 1 da xato") } launch { // Bolalar korutina 2 delay(200) println("Bolalar 2 bajarildi") } } try { job.join() } catch (e: Exception) { println("Ota da xato ushlash: $e") } }Bu strukturali raqobatning asosiy xulq-atvori boʻlib, resurslar va holatlarning oqib ketishini oldini oladi.
-
asyncbilanawait()dan foydalanish.asyncda chiqarilgan xatoliklar avtomatik tarzda tarqatilmaydi. UlarDeferredichida saqlanadi va faqatawait()chaqirilganda chiqariladi.// async/await bilan xatoliklarni boshqarish suspend fun safeAsyncCall() = coroutineScope { val deferred = async { throw Exception("Async da xato") "Async natija" } try { val result = deferred.await() println("Natija: $result") } catch (e: Exception) { println("Async dan chiqarilgan xatoni ushlash: ${e.message}") } }Bu har bir asinxron vazifa uchun xatoliklarni tanlab boshqarishga imkon beradi.
| Usul | Maqsad | Uncaughtni boshqaradimi? | Tarqatishni o'zgartiradimi? |
|---|---|---|---|
try...catch |
Ichki korutina ichida xatoliklarni boshqarish | Yo'q | Yo'q |
CoroutineExceptionHandler |
Scope ichida boshqarilmagan xatoliklarni ushlash | Ha | Yo'q |
SupervisorJob/Scope |
Xatolik tarqalishini o'zgartirish | Yo'q | Ha |
| Strukturali raqobat | Xatolik yuz berganda avtomatik bekor qilish | Ha | Ha |
async + await() |
Xatoliklarni kechiktirilgan tarzda tarqatish | Yo'q | Ha (awaitgacha) |