Sobes.tech
Middle

Korutinlərdə səhv idarəetmə üsullarını bilirsinizmi?

sobes.tech Süni İntellekt

AI-dan cavab

  • try...catch bloklarından istifadə. Xəta idarəetməsinin standart üsulu. Korutina daxilində işləyir.

    // try-catch tətbiqi
    suspend fun fetchData(): String {
        return try {
            // Xəta çıxara biləcək əməliyyat
            throw Exception("Məlumatların yüklənməsində xəta")
            "Məlumatlar uğurla yükləndi"
        } catch (e: Exception) {
            "Xəta: ${e.message}"
        }
    }
    

    try...catch digər CoroutineScopedə işlədilən uşaq korutinalardan çıxarılan uncaught xəta üçün uyğun deyil.

  • CoroutineExceptionHandler. Bu, korutinalar tərəfindən atılan və idarə olunmayan xəta və istisnaları tutar, əgər onlar bu CoroutineScope və ya onun uşaq CoroutineScope-larında işə salınıbsa.

    // CoroutineExceptionHandler
    val handler = CoroutineExceptionHandler { _, exception ->
        println("Tutan xəta: $exception")
    }
    
    // CoroutineExceptionHandler tətbiqi
    GlobalScope.launch(handler) {
        // Xəta çıxara bilən korutina
        throw Exception("Korutinadakı xəta")
    }
    

    CoroutineExceptionHandler yalnız strukturlaşdırılmış konkurrentlik mexanizmi tərəfindən idarə olunmayan xəta üçün işləyir.

  • SupervisorJobsupervisorScope. Ənənəvi Job-dan fərqli olaraq, uşaq korutina xəta ilə Job-u ləğv edərsə, SupervisorJob Job-u ləğv etmir. supervisorScope SupervisorJob ilə CoroutineScope yaradır.

    // `supervisorScope` istifadə
    suspend fun loadMultipleData() = supervisorScope {
        val data1 = async {
            // Xəta çıxara bilər
            throw Exception("Data 1-də xəta")
            "Data 1"
        }
        val data2 = async {
            "Data 2"
        }
    
        // Müəyyən async üçün xəta idarəetməsi
        try {
            println("Nəticə 1: ${data1.await()}")
        } catch (e: Exception) {
            println("Data 1 yükləməsində xəta: ${e.message}")
        }
        println("Nəticə 2: ${data2.await()}")
    }
    

    Bu, müstəqil uşaq tapşırıqları üçün istifadə olunur, burada birinin xətası digərinə təsir etməməlidir. try...catch və ya CoroutineExceptionHandler-i əvəz etmir, sadəcə xəta yayılma davranışını dəyişir.

  • Strukturlaşdırılmış konkurrentlikdə xəta yayılması. Standart olaraq, uşaq korutinasında baş verən xəta, ana korutina və onun bütün qardaşlarını ləğv edir.

    // Xəta yayılmasının nümunəsi
    runBlocking {
        val job = launch {
            launch { // Uşaq korutina 1
                delay(100)
                throw Exception("Uşaq 1-də xəta")
            }
            launch { // Uşaq korutina 2
                delay(200)
                println("Uşaq 2 tamamlandı")
            }
        }
        try {
            job.join()
        } catch (e: Exception) {
            println("Ana korutina daxilində tutulan xəta: $e")
        }
    }
    

    Bu, strukturlaşdırılmış konkurrentlik davranışının əsasdır və resurs sızmalarını və vəziyyətləri qarşısını almağa kömək edir.

  • async ilə await() istifadə. async-da atılan xəta avtomatik yayılmır. Bu, Deferred daxilində saxlanılır və yalnız await() çağırıldıqda atılır.

    // async/await ilə xəta idarəetməsi
    suspend fun safeAsyncCall() = coroutineScope {
        val deferred = async {
            throw Exception("Async-də xəta")
            "Async nəticə"
        }
    
        try {
            val result = deferred.await()
            println("Nəticə: $result")
        } catch (e: Exception) {
            println("Async-dən çıxarılan xəta: ${e.message}")
        }
    }
    

    Bu, hər bir asinxron tapşırıq üçün xətaları seçməklə idarə etməyə imkan verir.

Üsul Təyinat Uncaught-u tutarmı? Yayılmanı dəyişirmi?
try...catch Mövcud korutina daxilində xəta idarəetməsi Yox Yox
CoroutineExceptionHandler Scope daxilində işlənməyən xəta tutma Bəli Yox
SupervisorJob/Scope Yayılma davranışını dəyişdirmək Yox Bəli
Strukturlaşdırılmış konkurrentlik Xətanın baş verməsi ilə avtomatik ləğv etmək Bəli Bəli
async + await() Xətanın gecikdirilmiş yayılması Yox Bəli (await-ə qədər)