[kotlin] 코틀린 코루틴의 실패 처리

코틀린 코루틴을 사용하다 보면 비동기 작업 중에 에러를 처리해야 하는 경우가 발생합니다. 이때 실패 처리를 위한 여러 가지 방법이 있는데, 이번 글에서는 주로 예외 처리를 중점으로 살펴보겠습니다.

예외 처리

코틀린 코루틴에서의 가장 일반적인 예외 처리 방법은 try-catch 블록을 사용하는 것입니다.

import kotlinx.coroutines.*

fun main() {
    runBlocking {
        try {
            coroutineScope {
                launch {
                    // 비동기 작업 수행
                    throw Exception("Something went wrong")
                }
            }
        } catch (e: Exception) {
            // 예외 처리
            println("Caught an exception: ${e.message}")
        }
    }
}

위의 예제에서는 coroutineScope 내에서 발생한 예외를 try-catch로 처리했습니다.

에러 핸들러 사용

또 다른 방법으로는 CoroutineExceptionHandler를 사용하여 예외를 처리할 수 있습니다.

import kotlinx.coroutines.*

fun main() {
    val exceptionHandler = CoroutineExceptionHandler { _, exception ->
        println("Caught an exception: ${exception.message}")
    }

    runBlocking {
        val job = GlobalScope.launch(exceptionHandler) {
            // 비동기 작업 수행
            throw Exception("Something went wrong")
        }
        job.join()
    }
}

CoroutineExceptionHandler를 사용하면 코루틴 내부에서 발생한 예외를 처리할 수 있습니다.

예외 처리를 위한 구조적 패턴

여러 코루틴이 함께 실행될 때, 각 코루틴에서 발생한 예외를 모아서 처리하는 구조적인 패턴을 사용할 수도 있습니다. 예를 들어, SupervisorJob을 사용하여 자식 코루틴의 예외를 처리할 수 있습니다.

import kotlinx.coroutines.*

fun main() {
    runBlocking {
        val supervisor = SupervisorJob()
        with(CoroutineScope(coroutineContext + supervisor)) {
            val child1 = launch {
                // 비동기 작업 수행
                throw Exception("Child 1 failed")
            }
            val child2 = launch {
                // 비동기 작업 수행
                throw Exception("Child 2 failed")
            }
            supervisor.join()
        }
    }
}

위의 코드에서 SupervisorJob을 사용하여 자식 코루틴의 예외를 처리하고 있습니다.

결론

코틀린 코루틴을 사용할 때는 실패 처리를 위한 다양한 방법을 사용할 수 있습니다. try-catch 블록을 사용한 예외 처리, CoroutineExceptionHandler를 활용한 실패 처리, 그리고 구조적인 패턴을 사용하여 예외를 처리할 수 있는 등 다양한 방법이 있습니다. 각 상황에 맞게 적절한 방법을 선택하여 코루틴을 효과적으로 활용해보세요.

이상으로 코틀린 코루틴에서의 실패 처리에 대해 알아보았습니다. 사용하시다가 궁금한 점이 있으면 언제든지 물어보세요!