코루틴의 취소와 예외

취소

코루틴을 취소하면, 내부적으로 취소 동작을 위해 CancellationException을 발생시킨다. 이 예외는 모든 핸들러들이 무시하므로, 핸들러를 등록해도 아무런 효과가 없다. 만약 코루틴 동작 중 취소 상황에 대한 처리 로직이 필요하다면, try-catch문을 활용하여 예외 처리용으로 사용이 가능하다.

코루틴의 취소는 다음과 같은 특징을 가지고 있다.

코루틴을 취소하는 메서드에는 다음이 있다.

fun main() = runBlocking {
    val job = launch {
        try {
            repeat(1000) { i ->
                println("I'm sleeping $i ...")
                delay(500L)
            }
        } finally {
            println("I'm running finally")
        }
    }
    delay(1300L) // delay a bit
    println("main: I'm tired of waiting!")
    job.cancelAndJoin() // cancels the job and waits for its completion
    println("main: Now I can quit.")
}
I'm sleeping 0 ...
I'm sleeping 1 ...
I'm sleeping 2 ...
main: I'm tired of waiting!
I'm running finally
main: Now I can quit.

예외

코루틴은 CancellationException(취소 예외) 이외의 예외를 만나면, 그 예외를 부모에게 전달하여 부모를 취소시키게 된다.

양방향 예외 (부모 → 자식, 자식 → 부모)

Untitled

일반적으로 코루틴은 취소예외 이외의 예외는 양방향 전파이다. 예외가 발생하면 해당 코루틴을 취소시키고, 예외를 부모 코루틴으로 전파시킨다. 전파받은 부모 코루틴은 자신과 자신의 자식 코루틴을 취소 시키고, 또 다시 자신의 부모 코루틴으로 예외를 전파한다.