Error Handling 是系統架構很重要的一部份,當開始設計新功能時,大多時候是討論 happy path, 但是當新功能上線後,常常注意到的是問題、錯誤,可能因而造成壞印象。因此,在開發程式時,也要多留心錯誤處理。
現代化的框架都有考慮到錯誤處理。 Quarkus 跟 Spring Boot 都有相對的 Global Exception Handling 的 pattern. 這種常常像一張大網,去抓住從下面不知道哪一層出來的 runtime exception. Spring Boot 與 Kotlin 都是偏好 unchecked exception 由 filter 的方式在外層抓住 excpeiton. 這種行為想想其實有點像 goto。
KotlinConf 2019: Error Handling Strategies for Kotlin Programs
前面幾天有談了 Reactive,在 Reactive Programming 中通常就會引入 Functional Programming 所以組一起變成FRP。我們可以把程式流程當作流水線的資料流處理,並且同時考慮到 happy path 與 unhappy path. 對於錯誤正視他不是丟出他。時時帶著走
在後續的專案,就會引入 ARROW KT 這個 Kotlin functional programming 補完計畫。其中 Either 就是一個包著正確值或是錯誤的盒子,有 Left (unhappy) 與 Right (happy) 兩種可能,因為 Right 就是正確的意思。 Kotlin 原生的 Result Type 也是一樣的意思。
sealed class Either<out A, out B>
而把這樣的 Either Monad 的處理方式串起來,就會稱作 Railway Programming
下面的程式就會是 Either 中常見的操作,如果是happy path 就可以回 .right()
unhappy Path 就會是 .left()
。那也可以用 Either.catch 去把可能的 exception 直接變成 Left<Throwable>
Either 的操作可以用 flatMap 串接來,flatMap 是先 map (transform) 再 flatten。
Either<Error, Either<Error,Type>>
打平成 Either<Error,Type>
上面的改法就可以很清楚我們的操作是,很接近文字的流程描述,所以可以稱作 Declarative Programming ,程式的可讀性提高了,也考慮到了錯誤處理。
明天來把 Arrow KT 應用在我們的專案吧。