코루틴 예외 처리는 비동기 코드에서 예외를 효과적으로 처리하는 중요한 부분입니다. 코루틴에서 예외는 전파되며, 여러 가지 방법으로 처리할 수 있습니다.
1. 기본적인 예외 처리
코루틴에서 예외는 try, catch 블록을 사용하여 처리할 수 있습니다. 기본적인 방법은 다음과 같습니다.
import kotlinx.coroutines.*
fun main() = runBlocking {
val job = launch {
try {
// 예외를 발생시키는 작업
throw RuntimeException("Exception in coroutine")
} catch (e: Exception) {
println("Caught an exception: ${e.message}")
}
}
job.join()
println("End")
}
2. CoroutineExceptionHandler 사용
CoroutineExceptionHandler를 사용하면 특정 스코프 내에서 모든 코루틴에서 발생한 예외를 처리할 수 있습니다.
import kotlinx.coroutines.*
fun main() = runBlocking {
val exceptionHandler = CoroutineExceptionHandler { _, exception ->
println("Caught an exception: $exception")
}
val job = launch(exceptionHandler) {
// 예외를 발생시키는 작업
throw RuntimeException("Exception in coroutine")
}
job.join()
println("End")
}
3. Deferred 예외 처리
async를 사용하여 비동기적인 결과를 받을 때는 await 함수를 사용하여 결과를 받고, 이때 예외 처리가 가능합니다.
import kotlinx.coroutines.*
fun main() = runBlocking {
val deferred = async {
// 예외를 발생시키는 작업
throw RuntimeException("Exception in coroutine")
}
try {
val result = deferred.await()
println("Result: $result")
} catch (e: Exception) {
println("Caught an exception: ${e.message}")
}
println("End")
}
4. SupervisorJob 사용
SupervisorJob을 사용하면 자식 코루틴에서 발생한 예외가 부모 코루틴에 영향을 미치지 않습니다. 부모 코루틴은 계속 실행됩니다.
import kotlinx.coroutines.*
fun main() = runBlocking {
val supervisorJob = SupervisorJob()
val job = launch(supervisorJob) {
// 예외를 발생시키는 작업
throw RuntimeException("Exception in coroutine")
}
job.join()
println("End")
}
5. GlobalScope의 예외 처리
GlobalScope를 사용하여 전역적으로 실행되는 코루틴의 예외를 처리할 수 있습니다.
import kotlinx.coroutines.*
fun main() {
val job = GlobalScope.launch {
// 예외를 발생시키는 작업
throw RuntimeException("Exception in coroutine")
}
runBlocking {
job.join()
println("End")
}
}
6. 취소 예외 처리
코루틴이 취소될 때는 CancellationException이 발생하므로, 이 예외를 통해 취소된 코루틴을 처리할 수 있습니다.
import kotlinx.coroutines.*
fun main() = runBlocking {
val job = launch {
try {
// 예외를 발생시키는 작업
throw CancellationException("Coroutine is cancelled")
} catch (e: CancellationException) {
println("Caught a cancellation exception: ${e.message}")
}
}
job.cancel()
job.join()
println("End")
}
코루틴 예외 처리는 일반적인 예외 처리와 비슷하지만, 비동기적인 특성을 감안하여 몇 가지 특수한 사항을 고려해야 합니다. 필요에 따라 적절한 예외 처리 전략을 선택하여 안정적인 비동기 코드를 작성할 수 있습니다.
With ChatGPT
'Kotlin > 포스팅' 카테고리의 다른 글
코틀린 동시성 채널 (0) | 2024.01.10 |
---|---|
코틀린 동시성 통신 (0) | 2024.01.09 |
코루틴 디스패치 (0) | 2024.01.09 |
코루틴 타임아웃 (0) | 2024.01.09 |
코루틴 취소 (0) | 2024.01.09 |