1. 코루틴 예외 처리의 기본 원리
- 코틀린 코루틴은 일반적인 코드와 다른 독특한 예외 처리 메커니즘을 가지고 있습니다.
- 코루틴의 예외 처리를 이해하려면 코루틴의 구조화된 동시성(Structured Concurrency) 개념을 알아야 합니다.
- 구조화된 동시성이란 코루틴이 부모-자식 관계를 형성하며, 이 계층 구조를 따라 예외가 전파된다는 것을 의미합니다.
1.1 일반 코드와 코루틴의 예외 처리 차이
- 일반 코드에서는 예외가 발생하면 호출 스택을 따라 위로 전파됩니다.
- 코루틴에서는 예외가 발생하면 계층 구조 를 따라 부모 코루틴으로 전파됩니다.
- 일반 함수와 달리, 코루틴은 비동기적으로 실행되기 때문에 예외 전파 방식이 다릅니다.
중요 개념
코루틴에서 처리되지 않은 예외는 해당 코루틴을 즉시 취소하고, 부모 코루틴에도 전파되어 결국 모든 관련 코루틴이 취소될 수 있습니다.
1.2 예외 전파 메커니즘
- 코루틴에서 예외가 발생하면 다음과 같은 과정으로 처리됩니다:
- 예외가 발생한 코루틴은 즉시 취소됩니다.
- 예외는 부모 코루틴으로 전파됩니다.
- 부모 코루틴은 모든 자식 코루틴을 취소합니다.
- 이 과정이 루트 코루틴까지 계속됩니다.
1.2.1 예외 전파 예시
fun main() = runBlocking {
try {
coroutineScope {
launch {
println("자식 코루틴 1 시작")
delay(100)
throw RuntimeException("자식 코루틴 1 예외 발생")
}
launch {
println("자식 코루틴 2 시작")
delay(1000)
println("이 코드는 실행되지 않습니다") // 첫 번째 코루틴의 예외로 인해 취소됨
}
}
} catch (e: Exception) {
println("예외 잡힘: ${e.message}")
}
println("프로그램 계속 실행")
}