Sobes.tech
Middle

Дар бораи коркарди хато дар Flow чӣ медонед?

sobes.tech AI

Ҷавоб аз AI

Flow дар Kotlin Coroutines чанд роҳҳои ҳалли хатогиро пешниҳод мекунад:

  1. Оператор catch: Ҳамоҳангсозии истисноҳо дар ҷараёни болоравӣ ва имкон медиҳад, ки амал (масалан, сабт, баргардонидани маълумоти эҳтиётӣ) иҷро шавад ё ҷараён иваз карда шавад.

    flow {
        emit(1)
        throw RuntimeException("Таҳрир рӯй дод")
    }.catch { e: Throwable ->
        // Ҳалли хатогӣ
        emit(-1) // Иҷрои арзиши дигар дар ҳолати хатогӣ
    }.collect { value ->
        // Ҳалли арзишҳо
    }
    
  2. Блок try-catch: Роҳи классикӣ барои ҳалли истисноҳо дар атрофи қисмати код, аз ҷумла ҷамъоварии Flow.

    try {
        flow {
            emit(1)
            throw RuntimeException("Таҳрир рӯй дод")
        }.collect { value ->
            // Ҳалли арзишҳо
        }
    } catch (e: Throwable) {
        // Ҳалли хатогӣ
    }
    

    Ин усул хатогиро, ки ҳангоми ҷамъоварии Flow рӯй медиҳад, мегирад, аммо хатогиҳо, ки аз ҷониби эмитент (пуркунандаи) Flow пеш аз ҷамъоварӣ ба вуҷуд меоянд, намегирад.

  3. Оператор onEach бо try-catch: Агар лозим бошад, ки хатогиро барои ҳар як унсур ҷудогона ҳалли кунед.

    flow {
        emit(1)
        emit(2)
        throw RuntimeException("Хатогӣ пас аз 2")
        emit(3)
    }.onEach { value ->
        try {
            // Ҳалли ҳар як унсур
            if (value == 2) throw IllegalArgumentException("Арзиш нодуруст 2")
        } catch (e: Throwable) {
            // Ҳалли хатогӣ барои арзиши муайян
            println("Хатогӣ барои арзиши $value: ${e.message}")
            // Мумкин аст, ки хатогиро такрор ба вуҷуд оред, агар мехоҳед ҷараёнро боздоред
            throw e
        }
    }.catch { e: Throwable ->
        // Ҳалли хатогиҳо, ки дар onEach дастгирӣ нашудаанд, ё хатогиҳое, ки пас аз onEach ба вуҷуд омадаанд
        println("Хатогии ниҳоӣ: ${e.message}")
    }.collect { value ->
        println("Арзиши ҷамъоварӣ: $value")
    }
    
  4. Оператор retry / retryWhen: Имкон медиҳанд, ки манбаърои Flow дар ҳолати хатогӣ такрор шавад.

    • retry: танҳо кӯшишро такрор мекунад, то чанд маротиба муайяншуда.
    • retryWhen: имкон медиҳад, ки шарте барои такрор муайян кунед.
    var attempt = 0
    flow {
        println("Кӯшиш ${++attempt}")
        if (attempt < 3) throw RuntimeException("Кӯшиши такрор")
        emit(10)
    }.retryWhen { cause, attempt ->
        // Логикаи муайян кардани, ки оё бояд такрор шавад
        cause is RuntimeException && attempt < 3
    }.collect { value ->
        println("Муросо: $value")
    }
    
  5. Пешбарӣ кардани истисноҳо: Хатогиҳо, ки ба таври равшан дастгирӣ нашудаанд, ба боло дар пайдарпайии Flow интиқол дода мешаванд ва метавонанд дар блоки try-catch ё оператори catch дастгирӣ шаванд.

Муҳим аст, ки фаҳмед, ки оператори catch хатогиҳоро дар ҷараёни боло (upstream) мегирад. Хатогиҳое, ки дар ҷараёни поён (downstream) пас аз catch ба вуҷуд меоянд, дастгирӣ намешаванд. Барои ҳалли чунин хатогиҳо, бояд дигар catch дар поёнтар ё try-catch дар атрофи ҷамъоварӣ истифода шавад.

Тавсия: ҳангоми ҷойгир кардани ҳалли хатогӣ, онро ба наздиктарин ҷойи манбаъ гузоред, агар имконпазир бошад, аммо дар назар дошта бошед, ки catch танҳо ҷараёни болоиро мегирад.