[kotlin] 코틀린 코루틴을 활용한 에러 핸들링
코루틴은 비동기 코드를 효과적으로 관리하기 위한 Kotlin의 기능 중 하나입니다. 에러 핸들링은 비동기 작업을 수행할 때 중요한 측면 중 하나이며, 코루틴을 통해 이를 효과적으로 다룰 수 있습니다.
코루틴에서의 에러 핸들링
코루틴에서는 try
와 catch
를 사용하여 예외를 처리할 수 있습니다. 또한, async
, await
와 같은 키워드를 사용하여 비동기 작업을 수행하고 에러를 처리할 수도 있습니다.
import kotlinx.coroutines.*
fun main() {
val job = GlobalScope.launch {
try {
val result = async { fetchUserData() }.await()
println("User data: $result")
} catch(e: Exception) {
println("Error fetching user data: ${e.message}")
}
}
runBlocking { job.join() }
}
suspend fun fetchUserData(): String {
delay(1000) // Simulate a network delay
throw Exception("Network error") // Simulate an error
return "User123"
}
위의 예시에서, fetchUserData
함수는 비동기적으로 실행되며, 에러를 발생시킵니다. async
함수는 비동기 작업을 수행하고, await
로 해당 작업을 대기합니다. try-catch
구문을 통해 에러를 처리할 수 있습니다.
에러 핸들링에서의 중첩
코루틴을 사용하면 여러 비동기 작업을 묶어서 처리하는 경우가 많습니다. 이러한 상황에서는 각각의 작업에서 발생한 에러를 적절하게 처리해야 합니다. 이때 SupervisorJob
을 사용하여 에러 핸들링을 중첩 구조로 구현할 수 있습니다.
fun main() = runBlocking {
val handler = CoroutineExceptionHandler { _, exception ->
println("Caught $exception")
}
val supervisor = SupervisorJob()
with(CoroutineScope(coroutineContext)) {
val child1 = launch(supervisor + handler) {
println("Child 1 is failing")
throw AssertionError("Child 1 is cancelled")
}
val child2 = launch(supervisor + handler) {
println("Child 2 is successful")
}
child1.join()
child2.join()
}
}
위의 예시에서, SupervisorJob
을 사용하여 에러 핸들링을 구현하고, CoroutineExceptionHandler
를 통해 에러를 처리하고 있습니다.
결론
코틀린 코루틴을 사용하여 에러 핸들링을 효과적으로 구현할 수 있습니다. try
와 catch
를 사용하여 단일 작업에서의 에러를 처리하고, SupervisorJob
을 활용하여 중첩된 비동기 작업에서의 에러를 효과적으로 다룰 수 있습니다.