https://medium.com/android-ideas/never-use-exceptions-for-logic-in-kotlin-982609ce32c1
이 글에서는 그냥 예외를 던지는 것이 위험하고, 예측하지 못한 스파게티가 되며(catch 하는 것을 잊을 수 있기 때문에), 효율적이지 못하다고 한다.
코틀린 내장 Result를 사용할 수도 있지만 역시 이 클래스도 실패 시 throwable(또는 exception)을 던지기 때문에 stack trace가 나온다는 자체가 문제라고 한다. 때문에 커스텀 한 클래스를 만들어 사용하기를 권장한다.
보통 sealed interface를 사용해서 result를 캐스팅 할 수 있도록 만드는데, 특히 에러에 대해 ui단에서 사용할 수 있는 메시지까지 만들어두면 더 좋은 것 같다.
CoroutineContext는 코루틴을 어떻게 처리할 것인지에 대한 여러 정보(Element)를 가지고 있는 인터페이스이다.
get: key에 해당하는 context element를 반환
fold: initial value를 시작으로 element들을 병합하여 반환
plus: 현재 context에 파라미터로 받은 context의 element들을 합친 context를 반환
minusKey: key에 해당하는 element를 제외한 context를 반환
Element: id, name, dispatchers, interceptor, exceptionHandler 등을 의미, CoroutineContext를 상속

https://medium.com/@mohamed.ma872/understanding-yield-in-android-coroutines-4c5f654b53d2
yield() 는 suspend function으로 현재 코루틴이 suspend될 수 있고 다른 코루틴이 실행될 수 있도록 dispatcher에게 알려준다. 오래 걸리는 작업이 스레드를 독점하지 않도록 할 수 있다.