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:
-
catchoperatoru: 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 } -
try-catchbloku: 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. -
onEachoperatoru 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") } -
retry/retryWhenoperatorları: 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") } -
İ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-catchbloku və yacatchoperatoru 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.