[英]Scala error handling: Try or Either?
給定UserService: update
的方法,這里處理錯誤/異常的最佳方法是什么?
def update(...): Try[User]
這樣,我需要定義我的自定義異常 ,並在需要時將它們放入函數體中。 大多數這些異常都是業務錯誤(例如,user_id不能更改等)。 這里的重點是無論拋出什么異常(業務錯誤,網絡異常,DB IO異常等),以同樣的方式對待它們並返回Failure(err)
- 讓上層處理它們。
def update(...): Either[Error, User]
這是無異常的方式。 在函數體中,它捕獲所有可能的異常並將它們轉換為Error,對於業務錯誤,只返回Left[Error]
。
使用Try
對我來說似乎是一種更自然的方式,因為我想處理錯誤。 Either
是更通用的東西 - Either[Error, T]
只是一個特例,我認為Try
是針對這種特殊情況發明的。 但我也讀到我們應該避免使用異常進行錯誤處理......
那么,哪種解決方案更好,為什么呢?
沒有銀彈。
正如您已經注意到的, Try
只是一個更專業的Either
版本,其中Left
類型固定為Throwable
。
如果你需要實現外部(也許是java)庫拋出的異常,那么Try
可能是一個很好的選擇,因為它的構造函數會自動捕獲它們。
Try
另一個優點是它有map
和flatMap
,所以你可以直接在for-comprehensions中使用它,而使用Either
你必須明確地在right
情況下進行投影。 無論如何,有很多替代實現具有“右偏”,可能scalaz \\/
type是最受歡迎的。
話雖這么說,我通常使用\\/
或幾乎等效的Validation
(都來自scalaz),因為我喜歡能夠返回不擴展Throwable
錯誤。
它還允許更精確的錯誤類型,這是一個巨大的勝利。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.