Sobes.tech
Middle

Корутинада каталардын иштетүү жолдорун билесизби?

sobes.tech AI

AIден жооп

  • Колдонуунун try...catch блоктору. Стандарттык ыраазычылык ыкмасы. Корутиндин ичинде иштейт.

    // try-catch колдонуу
    suspend fun fetchData(): String {
        return try {
            // Исключение чыгара турган операция
            throw Exception("Маалыматты жүктөө ката")
            "Маалымат ийгиликтүү жүктөлдү"
        } catch (e: Exception) {
            "Ката: ${e.message}"
        }
    }
    

    try...catch башка CoroutineScope ичинде иштетилген балдар корутиналардан чыккан чыгымдарды иштетүү үчүн ылайыктуу эмес.

  • CoroutineExceptionHandler. Бул иштетилбеген чыгымдарды кармайт, алар ушул CoroutineScope же анын балдары тарабынан иштетилген корутиналардан чыгат.

    // CoroutineExceptionHandler
    val handler = CoroutineExceptionHandler { _, exception ->
        println("Кармалган чыгым: $exception")
    }
    
    // CoroutineExceptionHandler колдонуу
    GlobalScope.launch(handler) {
        // Чыгым чыгара турган корутина
        throw Exception("Корутинда ката")
    }
    

    CoroutineExceptionHandler гана иштетилбеген чыгымдар үчүн иштейт, структураланган атаандаштык механизми тарабынан иштетилбеген.

  • SupervisorJob жана supervisorScope. Бул Job-дан айырмаланып, балдар корутинанын катага учурашы ата-энесинин Job-ун жок кылууга алып келбейт. supervisorScope SupervisorJob менен CoroutineScope түзөт.

    // supervisorScope колдонуу
    suspend fun loadMultipleData() = supervisorScope {
        val data1 = async {
            // Исключение чыгара алат
            throw Exception("Маалыматтарда ката 1")
            "Маалыматтар 1"
        }
        val data2 = async {
            "Маалыматтар 2"
        }
    
        // Конкреттүү async үчүн чыгымдарды иштетүү
        try {
            println("Жыйынтык 1: ${data1.await()}")
        } catch (e: Exception) {
            println("Маалыматтарды жүктөөдө ката 1: ${e.message}")
        }
        println("Жыйынтык 2: ${data2.await()}")
    }
    

    Бул көзкарандысыз балдар тапшырмалары үчүн колдонулат, биринин ката башкасына таасир этпеши керек. try...catch же CoroutineExceptionHandler ордуна, чыгымдардын жайылуу жүрүм-турумун өзгөртөт.

  • Структураланган атаандаштыкта чыгымдардын жайылуусу. Дефолт боюнча, балдар корутиналарда чыккан чыгымдар ата-эне корутинаны жана анын сиблингдерин жок кылат.

    // Чыгымдын жайылуу мисалы
    runBlocking {
        val job = launch {
            launch { // Балдар 1
                delay(100)
                throw Exception("Балдар 1 ката")
            }
            launch { // Балдар 2
                delay(200)
                println("Балдар 2 аяктады")
            }
        }
        try {
            job.join()
        } catch (e: Exception) {
            println("Анада чыккан чыгым: $e")
        }
    }
    

    Бул структураланган атаандаштыктын негизги жүрүм-туруму болуп саналат, ал ресурстарды жана абалдарды чыгарып кетүүдөн сактайт.

  • async жана await() колдонуу. async ичинде чыккан чыгымдар автоматтык таралбайт. Алар Deferred ичинде сакталат жана await() чакырылганда гана чыгат.

    // `async` жана `await()` менен чыгымдарды иштетүү
    suspend fun safeAsyncCall() = coroutineScope {
        val deferred = async {
            throw Exception("Async ката")
            "Async натыйжасы"
        }
    
        try {
            val result = deferred.await()
            println("Натыйжа: $result")
        } catch (e: Exception) {
            println("Async чыгымын кармоо: ${e.message}")
        }
    }
    

    Бул ар бир асинхрондуу тапшырма үчүн каталарды тандоого мүмкүндүк берет.

ыкма максаты не иштейт? өзгөртөт па таралышын?
try...catch ички корутинда чыгымдарды иштетүү Жок Жок
CoroutineExceptionHandler Scope ичинде иштетилбеген чыгымдарды кармоо Ооба Жок
SupervisorJob/Scope чыгымдардын таралышын өзгөртүү Жок Ооба
Структураланган атаандаштык катанын учурунда автоматтык жок кылуу Ооба Ооба
async + await() чыгымдардын кечиктирилген таралышы Жок Ооба (await чейин)