0Pricing
Kotlin Academy · Ders

finally ve NonCancellable ile Temizleme

İptal edilen koroutinlerde finally ve withContext(NonCancellable) kullanarak kaynakları serbest bırakın.

finally ve NonCancellable ile Temizleme, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 3. 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.

İptal ve finally

Bir korutin iptal edildiğinde askıya alma noktaları CancellationException fırlatır. finally bloklarındaki kod her zaman çalışır — ancak finally bloğu iptal edilmiş bir korutin bağlamında çalışır.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val job = launch {
        try {
            delay(1000)
        } finally {
            println("finally: cleaning up")
        }
    }
    delay(50)
    job.cancel()
    job.join()
}

finally İçinde Askıya Alma Sorunu

İptal edilmiş bir korutinin finally bloğu içinde delay çağırmayı veya başka bir askıya alma işlemi gerçekleştirmeyi denerseniz, bağlam zaten iptal edilmiş olduğundan işlem hemen istisna fırlatır.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val job = launch {
        try {
            delay(1000)
        } finally {
            // delay(100) // throws CancellationException here!
            println("Sync cleanup OK; async cleanup needs NonCancellable")
        }
    }
    delay(50); job.cancel(); job.join()
}

withContext(NonCancellable)

Üst öğe iptal edildikten sonra bile askıya alma çağrılarını iptal edilemeyen bir bağlamda çalıştırmak için finally içindeki çağrıları withContext(NonCancellable) ile sarın.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val job = launch {
        try {
            delay(1000)
        } finally {
            withContext(NonCancellable) {
                delay(100)  // OK: runs despite cancellation
                println("Async cleanup complete")
            }
        }
    }
    delay(50); job.cancel(); job.join()
}

NonCancellable Ne Zaman Kullanılır

NonCancellable şunlar için kullanılır: veritabanı bağlantılarını kapatmak, günlükleri diske yazmak, analiz olaylarını göndermek veya iptalden bağımsız olarak tamamlanması gereken herhangi bir eşzamansız temizleme işlemi.

import kotlinx.coroutines.*
suspend fun closeConnection() {
    println("Closing DB connection...")
    delay(50) // simulate async close
    println("Connection closed")
}
fun main() = runBlocking {
    val job = launch {
        try { delay(1000) }
        finally { withContext(NonCancellable) { closeConnection() } }
    }
    delay(50); job.cancel(); job.join()
}

NonCancellable Bir Kapsam Değildir

NonCancellable, withContext'e aktarabileceğiniz bir Job'dır. Bunu doğrudan korutin kapsamı olarak kullanmayın — yalnızca finally içindeki temizlik işlemlerinde kullanın.

import kotlinx.coroutines.*
fun main() = runBlocking {
    // WRONG usage:
    // launch(NonCancellable) { ... } // launches a coroutine that cannot be cancelled
    // RIGHT usage:
    launch {
        try { delay(500) }
        finally {
            withContext(NonCancellable) {
                println("Safe cleanup")
            }
        }
    }.also { delay(50); it.cancel(); it.join() }
}

Birden Çok Kaynağın Temizlenmesi

Birden çok temizleme işlemini tek bir withContext(NonCancellable) bloğu içinde zincirleyin.

import kotlinx.coroutines.*
fun main() = runBlocking {
    launch {
        try {
            delay(1000)
        } finally {
            withContext(NonCancellable) {
                delay(20); println("Step 1: flush cache")
                delay(20); println("Step 2: close socket")
                delay(20); println("Step 3: log audit")
            }
        }
    }.also { delay(50); it.cancel(); it.join() }
}

try/catch/finally Kalıbı

İş kurallarına ilişkin hatalar için try-catch'i, temizlik için finally'ı birlikte kullanın — bu, standart yapılandırılmış kalıptır.

import kotlinx.coroutines.*
fun main() = runBlocking {
    launch {
        try {
            delay(100)
            throw RuntimeException("business error")
        } catch (e: RuntimeException) {
            println("Handling: ${e.message}")
        } finally {
            withContext(NonCancellable) {
                println("Always cleanup")
            }
        }
    }.join()
}

Temizleme Sıralaması

finally blokları iç içe geçme sırasının tersine çalışır. Dıştaki try-finally, tıpkı normal Java/Kotlin kodunda olduğu gibi içtekilerden sonra çalışır.

import kotlinx.coroutines.*
fun main() = runBlocking {
    launch {
        try {
            try {
                delay(1000)
            } finally { println("Inner cleanup") }
        } finally { println("Outer cleanup") }
    }.also { delay(50); it.cancel(); it.join() }
}

AutoCloseable Kaynakları için use()

AutoCloseable kaynakları için, istisnalarda veya iptal durumunda bile close() çağrısını otomatik olarak yapan Kotlin use { } uzantısını kullanın.

import kotlinx.coroutines.*
class Connection : AutoCloseable {
    init { println("Opened") }
    override fun close() { println("Closed") }
    suspend fun query(): String { delay(50); return "result" }
}
fun main() = runBlocking {
    val result = Connection().use { it.query() }
    println(result)
}

İptal Nedenini Günlükleme

Bir korutinin neden durduğunu günlüklemek için catch veya finally içinde CancellationException içindeki iptal iletisini alın.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val job = launch {
        try {
            delay(1000)
        } catch (e: CancellationException) {
            println("Cancelled: ${e.message}")
            throw e
        }
    }
    delay(50)
    job.cancel("user navigated away")
    job.join()
}

invokeOnCompletion ile CoroutineScope Temizliği

Job.invokeOnCompletion, iş herhangi bir nedenle tamamlandığında çalışacak bir geri çağırma işlevi kaydeder — üst düzey temizlik için finally'ye bir alternatiftir.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val job = launch {
        delay(1000)
    }
    job.invokeOnCompletion { cause ->
        if (cause != null) println("Ended with: ${cause::class.simpleName}")
        else println("Completed normally")
    }
    delay(50)
    job.cancel()
    job.join()
}

Hızlı Kontrol

finally bloğunda withContext(NonCancellable) kullanmanın amacı nedir?

Özet

finally iptal durumunda her zaman çalışır. İptale rağmen tamamlanabilmeleri için finally içindeki askıya alma çağrılarını withContext(NonCancellable) ile sarın. AutoCloseable kaynakları için use { } kullanın.

Sıkça Sorulan Sorular

“finally ve NonCancellable ile Temizleme” dersi ücretsiz mi?

Evet — “finally ve NonCancellable ile Temizleme” 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.

“finally ve NonCancellable ile Temizleme” dersinde ne öğreneceğim?

İptal edilen koroutinlerde finally ve withContext(NonCancellable) kullanarak kaynakları serbest bırakın. 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 3. dersidir.

“finally ve NonCancellable ile Temizleme” 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. İş Birlikli İptal: isActive ve ensureActive
  2. withTimeout ve withTimeoutOrNull
  3. finally ve NonCancellable ile Temizleme
  4. Koroutin Hiyerarşilerinde İptal Yayılımı
← Kotlin Academy Sayfasına Dön