본문 바로가기

Kotlin/kotlinx.coroutines

CopyableThrowable

📌 Kotlin Coroutines의 CopyableThrowable 이해하기

1. 개요

CopyableThrowable는 스택 트레이스 복구 시 클래스별 방식으로 복제될 수 있는 Throwable을 나타내는 인터페이스입니다. 스택 트레이스 복구에 대한 추가 정보는 STACKTRACE_RECOVERY_PROPERTY_NAME를 참고하세요.

2. 함수 시그니처


@ExperimentalCoroutinesApi
interface CopyableThrowable {
    fun createCopy(): T?
}

3. 사용 예시

CopyableThrowable를 구현하여 스택 트레이스 복구 시 예외를 복제하는 방법의 예시입니다:


import kotlinx.coroutines.*
import kotlin.coroutines.*

class BadResponseCodeException(val responseCode: Int) : Exception(), CopyableThrowable {
    override fun createCopy(): BadResponseCodeException? {
        val result = BadResponseCodeException(responseCode)
        result.initCause(this)
        return result
    }
}

fun main() = runBlocking {
    val job = launch {
        throw BadResponseCodeException(404)
    }
    job.join()
}

위 예시에서, BadResponseCodeException 클래스는 CopyableThrowable을 구현하여 스택 트레이스 복구 시 예외를 복제할 수 있습니다. createCopy 함수는 현재 인스턴스의 복사본을 생성하며, 디버깅을 용이하게 하기 위해 원본 예외를 원인(cause)으로 설정합니다.

4. 주의사항

  • 복제 메커니즘은 JVM에서만 사용되지만, 공통 예외에서 이를 구현하면 JVM에서 스택 트레이스가 적절히 복구될 수 있습니다.
  • createCopy 함수는 현재 인스턴스의 복사본을 생성합니다. 디버깅을 용이하게 하기 위해, 결과 예외의 원인(cause)으로 원본 예외를 사용하는 것이 좋습니다. 복제된 예외의 스택 트레이스는 스택 트레이스 복구 메커니즘에 의해 Throwable.setStackTrace 호출로 덮어쓰여집니다. 예외는 이 함수에서 null을 반환하여 복제를 옵트아웃할 수 있습니다. 원본 예외의 억제된 예외는 복제하지 않아야 순환 예외를 피할 수 있습니다.

📌 원본 출처

본 문서의 내용은 Kotlin 공식 문서를 참고하여 작성되었습니다. 자세한 내용은 아래 공식 문서를 통해 확인할 수 있습니다.

🔗 Kotlin Coroutines 공식 문서 - CopyableThrowable

'Kotlin > kotlinx.coroutines' 카테고리의 다른 글

CoroutineDispatcher  (0) 2025.02.07
CopyableThreadContextElement  (0) 2025.02.07
CompletionHandler  (0) 2025.02.07
completeWith  (0) 2025.02.07
CompletableJob  (0) 2025.02.07