Korutinlerde hata işleme yöntemlerini biliyor musunuz?
sobes.tech yapay zeka
AI'dan gelen yanıt
-
try...catchbloklarının kullanımı. Standart hata işleme yöntemi. Coroutine içinde çalışır.// try-catch kullanımı suspend fun fetchData(): String { return try { // Hata fırlatabilecek işlem throw Exception("Veri yükleme hatası") "Veriler başarıyla yüklendi" } catch (e: Exception) { "Hata: ${e.message}" } }try...catchdiğerCoroutineScopeiçinde başlatılan alt coroutine'lerden fırlatılan yakalanmamış istisnaları işlemek için uygun değildir. -
CoroutineExceptionHandler. Bu, buCoroutineScopeveya onun altCoroutineScope'lerinde başlatılan coroutine'ler tarafından atılan yakalanmamış istisnaları yakalar.// CoroutineExceptionHandler val handler = CoroutineExceptionHandler { _, exception -> println("Yakalanan istisna: $exception") } // CoroutineExceptionHandler kullanımı GlobalScope.launch(handler) { // Hata fırlatabilecek coroutine throw Exception("Coroutine'da hata") }CoroutineExceptionHandler, yalnızca yapılandırılmış eşzamanlılık mekanizması tarafından yakalanmayan istisnalar için devreye girer. -
SupervisorJobvesupervisorScope. NormalJob'dan farklı olarak, hata yapan alt coroutine anaJob'u iptal ederken,SupervisorJobiptal etmez.supervisorScope,SupervisorJobile birCoroutineScopeoluşturur.// supervisorScope kullanımı suspend fun loadMultipleData() = supervisorScope { val data1 = async { // Hata fırlatabilir throw Exception("Veri 1 hatası") "Veri 1" } val data2 = async { "Veri 2" } // Belirli bir async için hata işleme try { println("Sonuç 1: ${data1.await()}") } catch (e: Exception) { println("Veri 1 yüklenirken hata: ${e.message}") } println("Sonuç 2: ${data2.await()}") }Bağımsız alt görevler için kullanılır, birinin hatası diğerlerini etkilememelidir.
try...catchveyaCoroutineExceptionHandler'ın yerini almaz, sadece istisna yayılım davranışını değiştirir. -
Yapılandırılmış eşzamanlılıkta istisna yayılımı. Varsayılan olarak, alt coroutine'deki istisna, ana coroutine'u ve tüm kardeşlerini iptal eder.
// İstisna yayılımı örneği runBlocking { val job = launch { launch { // Alt coroutine 1 delay(100) throw Exception("Alt 1 hatası") } launch { // Alt coroutine 2 delay(200) println("Alt 2 tamamlandı") } } try { job.join() } catch (e: Exception) { println("Ana coroutine'da yakalanan istisna: $e") } }Bu, yapılandırılmış eşzamanlılığın temel davranışıdır ve kaynak ve durum sızıntılarını önlemeye yardımcı olur.
-
asyncveawait()kullanımı.asyncile fırlatılan istisnalar otomatik olarak yayılmaz. BunlarDeferrediçinde saklanır ve yalnızcaawait()çağrıldığında fırlatılır.// async/await ile hata işleme suspend fun safeAsyncCall() = coroutineScope { val deferred = async { throw Exception("Async hatası") "Async sonucu" } try { val result = deferred.await() println("Sonuç: $result") } catch (e: Exception) { println("async'ten yakalanan istisna: ${e.message}") } }Bu, her bir asenkron görevin hatalarını seçici olarak işlemenize olanak tanır.
| Yöntem | Amaç | Yakalar uncaught? | Yayılımı değiştirir mi? |
|---|---|---|---|
try...catch |
Mevcut coroutine içindeki istisnaları işleme | Hayır | Hayır |
CoroutineExceptionHandler |
Scope içindeki yakalanmamış istisnaları yakalama | Evet | Hayır |
SupervisorJob/Scope |
İstisna yayılım davranışını değiştirme | Hayır | Evet |
| Yapılandırılmış eşzamanlılık | Hata durumunda otomatik iptal | Evet | Evet |
async + await() |
Ertelenmiş istisna yayılımı | Hayır | Evet (await öncesi) |