2015-04-22 71 views
2

我就像在Java中創建Scala的服務:我應該在Scala服務中使用Try作爲返回類型嗎?

trait PersonService { 
    def getById(id: Long): Person 
    def getAll: Iterable[Person] 
} 

而且我也相應的執行這項服務。

實際上,該服務與數據庫層交互並執行一些業務邏輯。所以這個方法可以拋出異常。

所以我有一個問題:我應該用Try換回返回類型的服務方法嗎?

I.e.我應該使用以下聲明:

trait PersonService { 
    def getById(id: Long): Try[Person] 
    def getAll: Try[Iterable[Person]] 
} 
+0

是的。或「未來」。 –

回答

4

這取決於服務產生的錯誤是否對消費者有意義。即他們是否期望知道不同的數據庫故障並可能重試?或者你是否將異常映射到消費者有意義的實例?在這兩種情況下,我都會使用一個Try[Person]

如果您最終只記錄錯誤並且您只是想避免,我建議您登錄PersonService並返回Option[Persons]

另外,如果你想傳達一些信息,以從空辨別故障,不上升到異常水平,考慮使用Either[FailureReason,Person]

1

你有4種標準選擇:

  1. Future:這可能是最習慣和靈活的,允許消費者更容易異步使用服務並處理錯誤(通過與Failure匹配)。

  2. Try:A Try向消費者表明操作可能失敗,並且他們應該準備好處理其例外情況。

  3. Either:您可以使用Either類似於一個Try這裏,但更多的自定義的錯誤信息(例如Either[ErrorType, ReturnType])。

  4. Option:這裏最簡單的選項是Option,您忽略錯誤的原因,如果操作成功,只返回Some

+1

考慮到與一個(「慢」)數據庫層的交互,「未來」涵蓋了所有的基礎。 – millhouse

+1

僅在數據庫層具有異步訪問模式的情況下。否則,在將來封裝類似JDBC的阻塞響應只會捆綁另一個線程 –

相關問題