使用explcitily传递throwable对象创建Either :: Left

时间:2018-06-02 14:49:35

标签: scala exception either

我正在设计一个返回的方法,并希望保持引用透明度。因此,我返回Either[Throwable, String]而不是返回结果并检查前置条件。目前看来如下:

def logName(arg: String): Either[Throwable, String] =
  if (arg.lenght < 5)
    Right(arg)
  else
    Left(new IllegalArgumentException(s"Illegal lenght"))

我感到困惑的是我创建了异常并且不抛出它,而只是将它存储在Left对象中。这是保护参照透明度的常见模式吗?

1 个答案:

答案 0 :(得分:2)

简而言之,是的。

抛出和捕获异常会破坏正常的执行流程,因此抛出异常的任何函数都不能被引用透明。通过返回包含在声明的返回类型的实例中的异常类实例,您将保留错误状态,并使调用也引用透明。此外,您允许呼叫者确定随后会发生什么。

根据您的要求,您可能已经知道,scala.util.Tryscala.util.Either的另一种选择。有关两者之间差异的更多信息,请参阅this answer to "What is the difference between Try and Either?"。如果您不关心出现什么异常,scala.Option是另一种可能性。