簡體   English   中英

Scala錯誤處理:嘗試還是要么?

[英]Scala error handling: Try or Either?

給定UserService: update的方法,這里處理錯誤/異常的最佳方法是什么?

選項A:

def update(...): Try[User]

這樣,我需要定義我的自定義異常 ,並在需要時將它們放入函數體中。 大多數這些異常都是業務錯誤(例如,user_id不能更改等)。 這里的重點是無論拋出什么異常(業務錯誤,網絡異常,DB IO異常等),以同樣的方式對待它們並返回Failure(err) - 讓上層處理它們。

選項B:

def update(...): Either[Error, User]

這是無異常的方式。 在函數體中,它捕獲所有可能的異常並將它們轉換為Error,對於業務錯誤,只返回Left[Error]

使用Try對我來說似乎是一種更自然的方式,因為我想處理錯誤。 Either是更通用的東西 - Either[Error, T]只是一個特例,我認為Try是針對這種特殊情況發明的。 但我也讀到我們應該避免使用異常進行錯誤處理......

那么,哪種解決方案更好,為什么呢?

沒有銀彈。

正如您已經注意到的, Try只是一個更專業的Either版本,其中Left類型固定為Throwable

如果你需要實現外部(也許是java)庫拋出的異常,那么Try可能是一個很好的選擇,因為它的構造函數會自動捕獲它們。

Try另一個優點是它有mapflatMap ,所以你可以直接在for-comprehensions中使用它,而使用Either你必須明確地在right情況下進行投影。 無論如何,有很多替代實現具有“右偏”,可能scalaz \\/ type是最受歡迎的。

話雖這么說,我通常使用\\/或幾乎等效的Validation (都來自scalaz),因為我喜歡能夠返回不擴展Throwable錯誤。

它還允許更精確的錯誤類型,這是一個巨大的勝利。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM