在Scala中返回代码

时间:2013-05-11 10:07:10

标签: scala error-handling return-value

假设我在Scala中编写一个函数,它返回一个返回代码SUCCESSERROR1ERROR2,...(注意是与scala.util.Either

不同

显然,我可以创建一个层次结构来表示返回代码,如下所示:

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

现在我想知道Scala中是否存在“标准”的惯用解决方案。

2 个答案:

答案 0 :(得分:3)

您可以使用Try作为Either的替代方案。 “左”值固定为Throwable,它是右偏的,这意味着map / flatMap等只会在成功时执行,异常会保持原样,就像wirh {{1}一样}和Some None。您可以在块周围使用Option来捕获非致命异常,并将结果包装在Try.apply中。

答案 1 :(得分: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 {
相关问题