[kotlin] 코루틴의 에러 핸들링하기

코루틴은 비동기 프로그래밍을 위한 Kotlin 라이브러리이며, 에러 핸들링이 매우 중요합니다. 코루틴을 사용하는 동안 예외가 발생할 수 있으며, 이러한 예외를 올바르게 처리하는 방법에 대해 알아보겠습니다.

기본적인 예외 핸들링

코루틴은 일반적으로 launchasync와 같은 함수를 사용하여 시작됩니다. 이러한 코루틴 내에서 발생하는 예외는 코루틴 스코프 내부에서 처리할 수 있습니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        // 코루틴 내에서 예외가 발생할 수 있는 작업 수행
        throw Exception("Something went wrong")
    }
    job.join()
}

위 예제에서는 launch를 사용하여 새로운 코루틴을 시작하고, 예외가 발생하면 해당 예외를 캐치하거나 전파하는 기본 예외 핸들링이 이루어집니다.

예외 전파와 처리

코루틴은 예외를 다른 코루틴으로 전파할 수 있습니다. 이를 위해 try-catch 구문을 사용하여 예외를 포착하고 처리할 수 있습니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        try {
            // 코루틴 내에서 예외가 발생할 수 있는 작업 수행
            throw Exception("Something went wrong")
        } catch (e: Exception) {
            // 예외를 처리
            println("Caught an exception: $e")
        }
    }
    job.join()
}

위 예제에서는 try-catch 구문을 사용하여 코루틴 내에서 발생한 예외를 포착하고 처리합니다.

SupvervisorJob을 사용한 예외 핸들링

SupervisorJob을 사용하면 부모 코루틴의 실패로 인해 자식 코루틴이 취소되는 것을 방지할 수 있습니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    val supervisor = SupervisorJob()

    val child1 = launch(supervisor) {
        println("Child 1 is working")
        throw Exception("Child 1 failed")
    }

    val child2 = launch(supervisor) {
        println("Child 2 is working")
    }

    child1.join()
    child2.join()
}

위 예제에서는 SupervisorJob을 사용하여 부모 코루틴의 실패로 인해 자식 코루틴이 취소되지 않게 하고, 그 결과 자식 1이 실패해도 자식 2는 계속 실행됩니다.

코루틴을 사용할 때 항상 예외에 대한 적절한 처리를 고려해야 합니다. 이를 통해 안정성이 향상되고, 예기치 않은 에러로부터 애플리케이션을 보호할 수 있습니다.

참고 자료

코루틴과 예외의 처리에 대한 보다 자세한 내용은 Kotlin 공식 문서를 참고하시기 바랍니다.