본문 바로가기
[Android]/[Kotlin]

코루틴 예외처리 주의

by Hevton 2023. 7. 1.
반응형

 

출시할 앱을 디버깅하는 과정에서, 앱이 어느새부턴가 동작이 잘 안되는 것을 확인했었다.

 

앱의 타입이 백그라운드 서비스 타입이라

이것이 시스템에 의해 종료된건지, 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

 

반응형