728x90
반응형
이번 글은 코루틴에서 try-catch절을 사용해 예외 처리를 해보는 시간이 될 것이다.
일반적인 예외 처리 상기하기
fun main() {
generateException()
}
fun generateException() {
throw RuntimeException()
}
이런 예외를 try-catch절로 처리한 상황과 그렇지 않은 상황을 떠올려보자.
먼저 예외 처리를 해두었다면 프로그램이 정상적으로 실행이 종료된다.
그렇지 않은 경우 로그를 남기며 프로그램에 크래시가 발생한다.
코루틴에 적용해보기
fun main() {
val scope = CoroutineScope(Job())
scope.launch {
generateException()
}
Thread.sleep(100)
}
fun generateException() {
throw RuntimeException()
}
당연히 위 코드는 어디선가 예외를 처리하지 않기에 크래시가 발생한다.
launch내부에서 예외를 처리하면 어떨까?
fun main() {
val scope = CoroutineScope(Job())
scope.launch {
try {
generateException()
} catch(e: Exception) {
println("Caught exception: $e")
}
}
Thread.sleep(100)
}
fun generateException() {
throw RuntimeException()
}
이렇게 예외를 처리했을 때는 문제없이 실행할 수 있다.
한 발자국 더 가보기
이번에는 try-catch절 내부에서 다시 launch를 통해 새 코루틴을 시작하고 내부에서 예외를 발생시킨다.
(한국어보다 코드로 보는 것이 이해가 빠를 것 같기도 하다.)
fun main() {
val scope = CoroutineScope(Job())
scope.launch {
try {
launch {
generateException()
}
} catch(e: Exception) {
println("Caught exception: $e")
}
}
Thread.sleep(100)
}
fun generateException() {
throw RuntimeException()
}
이 경우는 예외를 처리할 수 있을까?
코루틴 간 에러 전파에 대해 알고 있는 사람이라면 눈치챘을 것이라 생각한다.
답은 '처리할 수 없다'이다.
자식 코루틴에서 에러가 발생했고 이는 처리(handling)되지 않았기에 부모 코루틴에게 전파된다.
그리고 현재 부모 코루틴은 일반 Job객체를 사용 중이므로 예외와 함께 종료된다.
정리하기
코루틴에서 try-catch절을 사용한 예외 처리는 유효하다.
하지만, structured concurrency 개념도 유의하여 처리해야 한다.
728x90
반응형
'Study > Kotlin' 카테고리의 다른 글
Exception Handling Using ExceptionHandler in Coroutines (0) | 2025.05.30 |
---|---|
NonCancellable Coroutines 사용해보기 (0) | 2025.04.07 |
Coroutines Cooperative Cancellation (0) | 2025.04.06 |
LifecycleScope 간단히 알아보기 (0) | 2025.02.26 |
ViewModelScope 알아보기 (1) | 2025.02.25 |