2013-05-11 67 views
0

假設我寫Scala中的一個函數,該函數返回一個返回代碼SUCCESSERROR1ERROR2,...(注意,是從不同的scala.util.EitherScala的返回碼

很顯然,我可以創建一個層次結構來表示返回代碼如下:

trait ReturnCode 
case object Success extends ReturnCode 
case object Error1 extends ReturnCode 
case object Error2 extends ReturnCode 
...

現在,我不知道是否有一個「標準」的慣用Scala中該解決方案。

+1

爲什麼你不想使用'Either'或'Try'? – drexin 2013-05-11 10:15:18

+0

謝謝。我不知道scala.util.Try。 – Michael 2013-05-11 10:17:03

回答

2

您可以使用sealed關鍵字。

sealed trait ReturnCode 
case object Success extends ReturnCode 
case object Error1 extends ReturnCode 
case object Error2 extends ReturnCode 

你會得到一個警告,如果你會忘記一些代碼:

scala> def test(r: ReturnCode) = r match { 
    | case Success => "Success" 
    | case Error1 => "Error1" 
    | } 
<console>:1: warning: match may not be exhaustive. 
It would fail on the following input: Error2 
     def test(r: ReturnCode) = r match { 
3

您可以使用Try,作爲替代Either。 「左」值固定爲Throwable,它是右偏的,這意味着map/flatMap等只會在成功時執行,並且例外情況會保持原樣,就像wirh SomeNoneOption一樣。您可以在塊周圍使用Try.apply捕獲非致命異常,並將結果包含在Try中。

+0

如果我的失敗並不總是「Throwable」?如何在這種情況下使用'Try'? – Michael 2013-05-11 10:40:55

+1

在這種情況下,您可以創建自己的異常類型。使用'Try'的好處是你可以鏈接你的操作,然後處理錯誤。 – drexin 2013-05-11 10:55:27

+0

謝謝。我會考慮它。 – Michael 2013-05-11 13:13:21