🤩

kotlin coroutines の cancel をハンドリングする方法について

2024/07/31に公開

背景

kotlin coroutines の coroutine cancel のイベントをキャッチできる方法がないのか気になり調査しました。

結論

coroutine の try { } finally { } ブロックの利用でキャッチできる

実験

https://play.kotlinlang.org/

import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        try {            
            println("Coroutine is starting")
            delay(2000) // 長時間の処理をシミュレート
            println("This line will not be printed if the coroutine is cancelled")
        } finally {
            println("Finally block is executed")
        }
        
        println("This line will not be printed because cancel call before completing try block")
    }
    
    delay(500) // コルーチンが開始してから少し待つ
    job.cancel() // コルーチンをキャンセル
    
    println("Main coroutine ends")
}

output:

Coroutine is starting
Main coroutine ends
Finally block is executed

考察

tryブロック実行中にコルーチンがキャンセルされると、finallyブロックが実行された後、コルーチンの実行は終了する。

Discussion