0Pricing
Kotlin Academy · Ders

catch ve onCompletion: Flow'da Hata İşleme

Yukarı akış istisnalarını yakalayın ve Flow tamamlanma olaylarına tepki verin.

catch ve onCompletion: Flow'da Hata İşleme, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.

Flow İstisnalarının Temelleri

Bir akıştaki istisnalar akışı sonlandırır. İşlenmezse istisna toplayıcıya yayılır ve akış sona erer.

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    try {
        flow {
            emit(1)
            throw RuntimeException("stream error")
            emit(2)
        }.collect { println(it) }
    } catch (e: Exception) {
        println("Caught: ${e.message}")
    }
}

catch İşleci

catch, üst akıştaki istisnaları işler ve yedek değerler yayımlayabilir veya istisnayı yeniden fırlatabilir. Toplayıcının kendisinin fırlattığı istisnaları yakalamaz.

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    flow {
        emit(1)
        throw RuntimeException("oops")
    }.catch { e ->
        println("Caught: ${e.message}")
        emit(-1)  // fallback value
    }.collect { println(it) } // 1, then -1
}

catch Yalnızca Üst Akışı İşler

catch yalnızca akış oluşturucusundan ve üst akış işleçlerinden gelen istisnaları yakalar — collect lambda işlevinden gelenleri yakalamaz.

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    try {
        flowOf(1, 2, 3)
            .catch { e -> println("upstream: ${e.message}") }
            .collect {
                if (it == 2) throw RuntimeException("collector error") // not caught by catch
                println(it)
            }
    } catch (e: Exception) {
        println("Collector exception: ${e.message}")
    }
}

catch İçinde Yeniden Fırlatma

İstisnayı inceleyebilir ve işleyemediğiniz istisnaları seçerek yeniden fırlatabilirsiniz.

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    try {
        flow {
            emit(1)
            throw IllegalStateException("state error")
        }.catch { e ->
            if (e is RuntimeException) { emit(-1); return@catch }
            throw e  // rethrow unknown exceptions
        }.collect { println(it) }
    } catch (e: Exception) {
        println("Rethrown: ${e.message}")
    }
}

onCompletion İşleci

onCompletion, akış normal olarak veya bir istisnayla tamamlandığında çalışır. Başarısızlık durumunda cause parametresi null değildir.

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    flowOf(1, 2, 3)
        .onCompletion { cause ->
            if (cause == null) println("Completed normally")
            else println("Failed: ${cause.message}")
        }
        .collect { println(it) }
}

Hata Durumunda onCompletion

Üst akışta bir istisna oluştuğunda bile onCompletion çalışır. İstisnayı cause olarak alır ancak istisnayı bastırmaz — istisna yine yayılır.

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    try {
        flow {
            emit(1)
            throw RuntimeException("error")
        }.onCompletion { cause ->
            println("onCompletion cause=${cause?.message}")
        }.collect { println(it) }
    } catch (e: Exception) {
        println("outer catch: ${e.message}")
    }
}

catch ve onCompletion'ı Birleştirme

Kurtarma işlemi yapmak ve yedek değerler yayımlamak için catch, sonuçtan bağımsız olarak günlük kaydı tutmak veya kaynakları serbest bırakmak için onCompletion kullanın.

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    flow {
        emit("ok")
        throw RuntimeException("network error")
    }.catch { e ->
        emit("fallback") // recover
    }.onCompletion {
        println("Stream done — release resources")
    }.collect { println(it) }
}

retry İşleci

retry(n) { ... }, istisna oluştuğunda üst akışa en fazla n kez yeniden abone olur.

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
var attempt = 0
fun unstableFlow() = flow {
    attempt++
    if (attempt < 3) throw RuntimeException("attempt $attempt failed")
    emit("success on attempt $attempt")
}
fun main() = runBlocking {
    unstableFlow()
        .retry(3) { e -> println("retrying: ${e.message}"); true }
        .collect { println(it) }
}

Özel Mantık için retryWhen

retryWhen, istisnayı ve deneme sayısını sağlar; böylece bekleme süresi ekleyebilir veya hangi istisnaların yeniden denemeyi tetikleyeceğini filtreleyebilirsiniz.

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    var n = 0
    flow {
        if (n++ < 2) throw IOException("IO error")
        emit("done")
    }.retryWhen { cause, attempt ->
        cause is IOException && attempt < 3
    }.collect { println(it) }
}

onStart İşleci

onStart, ilk yayımdan önce çalışır — veriler gelmeden önce yüklenme durumlarını göstermek veya kaynakları başlatmak için kullanışlıdır.

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    flowOf("data")
        .onStart { emit("Loading...") }
        .onCompletion { emit("Done") }
        .collect { println(it) }
}

Gerçek API Çağrılarında Hata İşleme

Depo akışlarını, istisnaları alan hatalarına dönüştürmek için catch ile ve yükleme göstergelerini gizlemek için onCompletion ile sarın.

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
sealed class State { object Loading : State(); data class Data(val v: String) : State(); data class Error(val msg: String) : State() }
fun apiFlow(): Flow<String> = flow { delay(50); emit("response") }
fun uiFlow(): Flow<State> = apiFlow()
    .map { State.Data(it) as State }
    .onStart { emit(State.Loading) }
    .catch { e -> emit(State.Error(e.message ?: "unknown")) }
fun main() = runBlocking { uiFlow().collect { println(it) } }

Hızlı Kontrol

catch işleçlerinin temel sınırlaması nedir?

Özet

yakalama işleci, üst akıştaki istisnaları işler ve geri dönüş değerleri üretebilir. onCompletion, temizlik veya günlükleme için her zaman çalışır (normal tamamlanmada ya da hata durumunda). Dayanıklı akış işlem hatları oluşturmak için bunları yeniden deneme/retryWhen ile birleştirin.

Sıkça Sorulan Sorular

“catch ve onCompletion: Flow'da Hata İşleme” dersi ücretsiz mi?

Evet — “catch ve onCompletion: Flow'da Hata İşleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.

“catch ve onCompletion: Flow'da Hata İşleme” dersinde ne öğreneceğim?

Yukarı akış istisnalarını yakalayın ve Flow tamamlanma olaylarına tepki verin. Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“catch ve onCompletion: Flow'da Hata İşleme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Flow İşleçleri: map, filter, transform ve take
  2. catch ve onCompletion: Flow'da Hata İşleme
  3. combine ve zip: Birden Çok Flow'u Birleştirme
  4. flowOn ve buffer: Bağlam ve Geri Basınç
← Kotlin Academy Sayfasına Dön