코루틴을 취소하면, 내부적으로 취소 동작을 위해 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
(취소 예외) 이외의 예외를 만나면, 그 예외를 부모에게 전달하여 부모를 취소시키게 된다.
⇒ 양방향 예외 (부모 → 자식, 자식 → 부모)
일반적으로 코루틴은 취소예외 이외의 예외는 양방향 전파이다. 예외가 발생하면 해당 코루틴을 취소시키고, 예외를 부모 코루틴으로 전파시킨다. 전파받은 부모 코루틴은 자신과 자신의 자식 코루틴을 취소 시키고, 또 다시 자신의 부모 코루틴으로 예외를 전파한다.