[Android/Kotlin] Error Handling By CoroutineExceptionHandler In MVVM Architecture
Android/Kotlin

[Android/Kotlin] Error Handling By CoroutineExceptionHandler In MVVM Architecture


viewModel 내에서 Coroutine을 활용하다 보면, 에러 처리를 하기 위해 try ~ catch문을 활용하곤 합니다. 
그러나 이를 남용하면 Boiler Plate가 되어버리게 됩니다.
전역적으로 발생할 수 있는 에러들을 CoroutineExceptionHandler을 통해 다루는 방법을 알아봅시다.

 

구현 방법에 대한 자세한 예시는 링크를 통해 보실 수 있습니다.

 

CoroutineExceptionHandler는 사실 특별한 것이 아닙니다. (배워야 할 게 없다는 것은 아닙니다)

내부적으로는 ThreadUncaughtExceptionHandler를 구현하는 것으로 작동하기 때문입니다.

CoroutineExceptionHandler을 타고가다 보면 발견할 수 있는 source.

UncaughtExceptionHandlerThread에서 캐치되지 않은 Runtime Exception을 일관된 방식으로 한 곳에서 처리할 수 있도록 해주는 인터페이스입니다. 

따라서 CoroutineExceptionHandler도 같은 의미로 사용하시면 됩니다. 

 

그렇다면 이를 ViewModel 내에서 사용하려면 어떻게 해야할까요?

그리고 특히, 모든 ViewModelCoroutineContextCoroutineExceptionHandler를 등록해줄 필요 없이, BaseViewModel 내에서 선언하여, 전역적으로 에러를 처리하기 위해선 어떻게 해야 할까요?

뭘자꾸어떻게해;

 

하지마루요

 

우선 여러 ViewModel에서 사용할 BaseViewModelDispatchersCoroutineExceptionHandler을 구성요소로 갖는 CoroutineContext를 선언해줍니다. 이는 하위 ViewModel에서 사용할 것이기 때문에 protected 키워드를 사용하였습니다.

 

그리고 CoroutineExceptionHandler에서는 디버깅중 Error을 추적할 수 있도록 printStackTrace()를 호출해주었고 Activity에 에러가 발생했음을 전달하기 위해서 SingleLiveEvent를 활용하였습니다. 이 때 일반적으로 call은 MainThread 위에서 작동하도록 되어있어 postCall()이라는 함수를 내부에 따로 구현해주었고 이를 사용하였습니다.

 

물론 call() 함수 위의 MainThread Annotation을떼도 문제없지만 사용처에 따른 구분을 위함입니다.

그리고 하위 ViewModel에서는 이 CoroutineContext를 사용하면 됩니다.

강제로 Error을 일으키기 위해서 throw IllegalStateException을 적어준 것 입니다. 

 

그리고 이 ViewModel을 사용하는 Activity에서는 위의 apiFailEvent를 observe합니다.

 

실행해보겠습니다.

잘 작동합니다...

 

단순 예시였지만 이러한 방식으로 CoroutineExceptionHandler로 전역적인 에러를 처리해주실 수 있습니다. 

 

감사합니다.