Sobes.tech
Middle

Flow-də səhvlərin idarə olunması haqqında nə bilirsiniz?

sobes.tech Süni İntellekt

AI-dan cavab

Kotlin Coroutines-dəki Flow, səhvləri idarə etmək üçün bir neçə üsul təqdim edir:

  1. catch operatoru: Yuxarı axında olan istisnaları ələ alır və hərəkət etməyə imkan verir (məsələn, qeydiyyat, ehtiyat məlumatların qaytarılması) və ya axını dəyişdirir.

    flow {
        emit(1)
        throw RuntimeException("Xəta baş verdi")
    }.catch { e: Throwable ->
        // Xəta ilə işləmə
        emit(-1) // Xəta zamanı başqa dəyər yay
    }.collect { value ->
        // Dəyərlərin işlənməsi
    }
    
  2. try-catch bloku: Kod hissəsinin ətrafında istisnaları idarə etmək üçün klassik üsul, Flow yığımı daxil.

    try {
        flow {
            emit(1)
            throw RuntimeException("Xəta baş verdi")
        }.collect { value ->
            // Dəyərlərin işlənməsi
        }
    } catch (e: Throwable) {
        // Xəta ilə işləmə
    }
    

    Bu üsul, Flow yığımı zamanı baş verən xətaları ələ alır, amma Flow-un emitter tərəfindən yığmadan əvvəl törədilən xətaları ələ almır.

  3. onEach operatoru ilə try-catch: Əgər hər bir element üçün xətaları ayrıca işləmək istəyirsinizsə.

    flow {
        emit(1)
        emit(2)
        throw RuntimeException("2-dən sonra xəta")
        emit(3)
    }.onEach { value ->
        try {
            // Hər elementin işlənməsi
            if (value == 2) throw IllegalArgumentException("Etibarsız dəyər 2")
        } catch (e: Throwable) {
            // Müəyyən dəyər üçün xəta ilə işləmə
            println("Dəyər $value üçün xəta: ${e.message}")
            // Axını dayandırmaq üçün istisna atıla bilər
            throw e
        }
    }.catch { e: Throwable ->
        // onEach-də tutulmayan və ya onEach-dən sonra atılan xətaların işlənməsi
        println("Nəticə xəta: ${e.message}")
    }.collect { value ->
        println("Yığılmış dəyər: $value")
    }
    
  4. retry / retryWhen operatorları: Xətalar baş verdikdə, Flow mənbəyini yenidən cəhd etməyə imkan verir.

    • retry: Sadəcə olaraq, müəyyən sayda təkrar edir.
    • retryWhen: Yenidən cəhd üçün şərti müəyyən etməyə imkan verir.
    var attempt = 0
    flow {
        println("Cəhd ${++attempt}")
        if (attempt < 3) throw RuntimeException("Təkrar")
        emit(10)
    }.retryWhen { cause, attempt ->
        // Yenidən cəhd etməyin şərti
        cause is RuntimeException && attempt < 3
    }.collect { value ->
        println("Uğur: $value")
    }
    
  5. İstisnaların ötürülməsi: Açıqlanmış şəkildə tutulmayan xətalar Flow zəncirində yuxarıya doğru ötürülür və try-catch bloku və ya catch operatoru ilə tutulabilir.

Əhəmiyyətli: catch operatoru, yuxarı axımdakı xətaları ələ alır. catch-dən sonra aşağı axımda (downstream) baş verən xətalar tutulmur. Bu cür xətaları idarə etmək üçün, daha aşağıda başqa bir catch və ya try-catch istifadə edilməlidir.

Ümumi tövsiyə: xəta mənbəyinə ən yaxın yerdə xəta idarəsini yerləşdirmək, mümkün olsa da, catch-in yalnız yuxarı axımı idarə etdiyini unutmayın.