假设我正在 Scala 中编写一个函数,它返回一个返回码:SUCCESS
, ERROR1
, ERROR2
, ...(注意与 不同scala.util.Either
)
显然,我可以创建一个层次结构来表示返回代码,如下所示:
特征返回码 案例对象 Success 扩展 ReturnCode 案例对象 Error1 扩展 ReturnCode 案例对象 Error2 扩展 ReturnCode ...
现在我想知道 Scala 中是否有一个“标准”的惯用解决方案。
假设我正在 Scala 中编写一个函数,它返回一个返回码:SUCCESS
, ERROR1
, ERROR2
, ...(注意与 不同scala.util.Either
)
显然,我可以创建一个层次结构来表示返回代码,如下所示:
特征返回码 案例对象 Success 扩展 ReturnCode 案例对象 Error1 扩展 ReturnCode 案例对象 Error2 扩展 ReturnCode ...
现在我想知道 Scala 中是否有一个“标准”的惯用解决方案。
您可以使用Try
, 作为Either
. “left”值固定Throwable
为右偏,这意味着 map/flatMap 等将仅在成功时执行,异常保持原样,就像 wirhSome
和None
for一样Option
。您可以Try.apply
在块周围使用来捕获非致命异常并将结果包装在Try
.
你可以使用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 {