Korutinlərdə səhv idarəetmə üsullarını bilirsinizmi?
sobes.tech Süni İntellekt
AI-dan cavab
-
try...catchblokları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...catchdigərCoroutineScopedə 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 buCoroutineScopevə ya onun uşaqCoroutineScope-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") }CoroutineExceptionHandleryalnız strukturlaşdırılmış konkurrentlik mexanizmi tərəfindən idarə olunmayan xəta üçün işləyir. -
SupervisorJobvəsupervisorScope. ƏnənəviJob-dan fərqli olaraq, uşaq korutina xəta iləJob-u ləğv edərsə,SupervisorJobJob-u ləğv etmir.supervisorScopeSupervisorJobiləCoroutineScopeyaradı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...catchvə yaCoroutineExceptionHandler-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.
-
asynciləawait()istifadə.async-da atılan xəta avtomatik yayılmır. Bu,Deferreddaxilində saxlanılır və yalnızawait()ç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) |