Hanbit the Developer

[Kotlin] Coroutines 예외 처리 방법 비교 본문

Mobile/Android

[Kotlin] Coroutines 예외 처리 방법 비교

hanbikan 2023. 8. 28. 11:57

배경

Kotlin의 Coroutines에서 예외 처리를 하는 방식은 다양합니다. 오늘은 세 가지 예외 처리 방식의 장단점을 비교하고자 합니다.

 

try-catch block

viewModelScope.launch {
    try {
        val data = getServiceListUseCase()
        // Handle data
    } catch (e: Exception) {
        // Handle exception
    }
}

- 장점: 직관적이고 간단합니다. 세부적인 예외 유형에 따른 처리가 쉽습니다.

- 단점: 반복적인 사용 시 코드 중복이 발생할 수 있습니다. 예를 들어, 여러 곳에서 네트워크 요청을 수행하는데 동일한 예외 처리 로직을 적용하는 경우, 코드의 중복이 발생합니다.

 

CoroutineExceptionHandler

val handler = CoroutineExceptionHandler { _, exception ->
    // Handle exception
}

viewModelScope.launch(handler) {
    val data = getServiceListUseCase()
    // Handle data
}

코루틴 내의 예외를 전역적으로 처리하는 핸들러입니다.

- 장점: 스코프 내에서 발생하는 모든 예외를 한 곳에서 처리할 수 있습니다. 코드 중복을 줄일 수 있습니다.

- 단점: 복잡한 작업을 하는 코루틴의 경우, 정확히 어디에서 예외가 발생했는지 파악하기 어렵습니다.

 

Result

viewModelScope.launch {
    getServiceListUseCase()
        .onSuccess {
            // Handle data
        }
        .onFailure {
            // Handle exception
        }
}

- 장점: 명시적으로 성공과 실패를 구분할 수 있습니다. 함수나 연산의 결과를 더 명확하게 표현할 수 있습니다.

- 단점: 코드가 약간 복잡해질 수 있습니다. 모든 연산에 대한 결과를 체크하고 처리해야 합니다.

 

결론

- 복잡도: Result > CoroutineExceptionHandler > try-catch

코루틴 작업이 복잡하여 세밀한 제어가 필요한 경우 Result를 사용하며, 그렇지 않고 예외 처리 로직이 단순한 경우 CoroutineExceptionHandler를 사용하는 것이 합리적인 것처럼 보입니다.

추가로 팀에서 예외 처리 방식을 결정할 때, 코드의 일관성, 가독성, 유지 보수성 또한 고려하면 도움이 될 것입니다.