iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0

錯誤處理的重要

Error Handling 是系統架構很重要的一部份,當開始設計新功能時,大多時候是討論 happy path, 但是當新功能上線後,常常注意到的是問題、錯誤,可能因而造成壞印象。因此,在開發程式時,也要多留心錯誤處理。

Global Exception handling

現代化的框架都有考慮到錯誤處理。 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

FRP ( Functional Reactive Programming )

前面幾天有談了 Reactive,在 Reactive Programming 中通常就會引入 Functional Programming 所以組一起變成FRP。我們可以把程式流程當作流水線的資料流處理,並且同時考慮到 happy path 與 unhappy path. 對於錯誤正視他不是丟出他。時時帶著走

ARROW KT - Either Monad

在後續的專案,就會引入 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

https://ithelp.ithome.com.tw/upload/images/20220920/20135701G0R1UBjQPw.png

Either Monad Sample

下面的程式就會是 Either 中常見的操作,如果是happy path 就可以回 .right() unhappy Path 就會是 .left()。那也可以用 Either.catch 去把可能的 exception 直接變成 Left<Throwable>

https://ithelp.ithome.com.tw/upload/images/20220920/20135701KKLqoUaafU.png

串起你的 Either

Either 的操作可以用 flatMap 串接來,flatMap 是先 map (transform) 再 flatten。

  • Map : 如果有右值,把右值拿出來 apply 該 function
  • Flatten : 把 Either<Error, Either<Error,Type>> 打平成 Either<Error,Type>

https://ithelp.ithome.com.tw/upload/images/20220920/20135701K5pHuC7vWj.png

上面的改法就可以很清楚我們的操作是,很接近文字的流程描述,所以可以稱作 Declarative Programming ,程式的可讀性提高了,也考慮到了錯誤處理。


明天來把 Arrow KT 應用在我們的專案吧。


上一篇
Quarkus 加快你的開發效率 - Live Reload - Day13
下一篇
用 Arrow KT 作錯誤處理,重構 Repository - Day 15
系列文
Quarkus, Kotlin, Reactive 雲原生服務開發32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言