viewModel 내에서 Coroutine을 활용하다 보면, 에러 처리를 하기 위해 try ~ catch문을 활용하곤 합니다.
그러나 이를 남용하면 Boiler Plate가 되어버리게 됩니다.
전역적으로 발생할 수 있는 에러들을 CoroutineExceptionHandler을 통해 다루는 방법을 알아봅시다.
구현 방법에 대한 자세한 예시는 링크를 통해 보실 수 있습니다.
CoroutineExceptionHandler는 사실 특별한 것이 아닙니다. (배워야 할 게 없다는 것은 아닙니다)
내부적으로는 Thread의 UncaughtExceptionHandler를 구현하는 것으로 작동하기 때문입니다.
UncaughtExceptionHandler는 Thread에서 캐치되지 않은 Runtime Exception을 일관된 방식으로 한 곳에서 처리할 수 있도록 해주는 인터페이스입니다.
따라서 CoroutineExceptionHandler도 같은 의미로 사용하시면 됩니다.
그렇다면 이를 ViewModel 내에서 사용하려면 어떻게 해야할까요?
그리고 특히, 모든 ViewModel에 CoroutineContext에 CoroutineExceptionHandler를 등록해줄 필요 없이, BaseViewModel 내에서 선언하여, 전역적으로 에러를 처리하기 위해선 어떻게 해야 할까요?
뭘자꾸어떻게해;
하지마루요
우선 여러 ViewModel에서 사용할 BaseViewModel에 Dispatchers와 CoroutineExceptionHandler을 구성요소로 갖는 CoroutineContext를 선언해줍니다. 이는 하위 ViewModel에서 사용할 것이기 때문에 protected 키워드를 사용하였습니다.
그리고 CoroutineExceptionHandler에서는 디버깅중 Error을 추적할 수 있도록 printStackTrace()를 호출해주었고 Activity에 에러가 발생했음을 전달하기 위해서 SingleLiveEvent를 활용하였습니다. 이 때 일반적으로 call은 MainThread 위에서 작동하도록 되어있어 postCall()이라는 함수를 내부에 따로 구현해주었고 이를 사용하였습니다.
그리고 하위 ViewModel에서는 이 CoroutineContext를 사용하면 됩니다.
강제로 Error을 일으키기 위해서 throw IllegalStateException을 적어준 것 입니다.
그리고 이 ViewModel을 사용하는 Activity에서는 위의 apiFailEvent를 observe합니다.
실행해보겠습니다.
잘 작동합니다...
단순 예시였지만 이러한 방식으로 CoroutineExceptionHandler로 전역적인 에러를 처리해주실 수 있습니다.
감사합니다.
'Android > Kotlin' 카테고리의 다른 글
[Android/Kotlin] coroutine StateFlow, SharedFlow의 등장 (0) | 2020.11.09 |
---|---|
[Android] WorkManager + Coroutine으로 매일 특정시간에 Notification 띄우기 (5) | 2020.04.21 |
[Android/Kotlin] CoroutineContext이 구성요소들을 추가하는 방법 (1) | 2020.02.25 |
[Android/kotlin] List vs MutableList vs ArrayList vs LinkedList (4) | 2020.01.28 |
[Kotlin] 함수형 프로그래밍 (0) | 2020.01.06 |