Kotlin/포스팅

코루틴 예외 처리

짜집퍼박사(짜박) 2024. 1. 9. 19:42

코루틴 예외 처리는 비동기 코드에서 예외를 효과적으로 처리하는 중요한 부분입니다. 코루틴에서 예외는 전파되며, 여러 가지 방법으로 처리할 수 있습니다.

 

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