[kotlin] 코루틴의 에러 핸들링하기
코루틴은 비동기 프로그래밍을 위한 Kotlin 라이브러리이며, 에러 핸들링이 매우 중요합니다. 코루틴을 사용하는 동안 예외가 발생할 수 있으며, 이러한 예외를 올바르게 처리하는 방법에 대해 알아보겠습니다.
기본적인 예외 핸들링
코루틴은 일반적으로 launch
나 async
와 같은 함수를 사용하여 시작됩니다. 이러한 코루틴 내에서 발생하는 예외는 코루틴 스코프 내부에서 처리할 수 있습니다.
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 공식 문서를 참고하시기 바랍니다.