반응형
출시할 앱을 디버깅하는 과정에서, 앱이 어느새부턴가 동작이 잘 안되는 것을 확인했었다.
앱의 타입이 백그라운드 서비스 타입이라
이것이 시스템에 의해 종료된건지, Doze 모드에 의해 멈춘건지, 비정상적으로 종료된건지 등
명확한 원인을 찾을 수 없었다.
그래서 예외가 발생하는 것인지 하여 예외처리를 했었지만, 예외처리에도 잡힌 결과가 없었다.
하지만 알고보니 예외처리를 잘못 하고 있었다.
서비스 내에서 난 다음와 같이 예외처리를 하고 있었다.
runCatching {
CoroutineScope(Dispatchers.IO).launch {
}
}.onFailure {
}
이렇게 하면 예외처리가 될 거라고 생각했다. 근데 예외가 잡히지 않고 있었다.
runCatching이 코루틴 스코프의 예외까지 잡아줄 것 같지만, 사실은 그렇지 못하다.
Coroutine의 Exception이 propagation되는 것과도 연관이 있다.
코루틴은 예외가 발생하여 처리되지 못하면 자신을 실행시킨 코루틴에게까지 에러가 propagation(전파) 되기 때문이다.
올바른 방법은 다음과 같다.
1. 코루틴 스코프 내에서 try ~ catch
CoroutineScope(Dispatchers.IO).launch {
try {
} catch (e: Exception) {
}
}
2. 코루틴 스코프 내에서 runCatching
CoroutineScope(Dispatchers.IO).launch {
runCatching {
}.onFailure {
}
}
3. CoroutineExceptionHandler 정의
val exceptionHandler = CoroutineExceptionHandler { _, throwable ->
// 예외 처리 코드를 여기에 작성
}
CoroutineScope(Dispatchers.IO).launch(exceptionHandler) {
}
참고
https://co-zi.medium.com/coroutine-%EC%97%90%EC%84%9C%EC%9D%98-error-handling-fb3a88dcd358
반응형
'[Android] > [Kotlin]' 카테고리의 다른 글
Kotest - 코틀린 기반의 테스트 코드 작성하기 (0) | 2023.11.02 |
---|---|
Google In app billing 6 - All products should be of the same product type. (1) | 2023.10.24 |
Kotlin combine (0) | 2023.05.07 |
[Kotlin / 코틀린] Setter (0) | 2023.03.29 |
[공부] 코틀린 RecyclerView 예제 (0) | 2023.01.13 |