使用显式传递可抛出对象创建 Either::Left

Createing Either::Left with explcitily passing throwable object

我正在设计一种方法 returning 并希望保持参考透明性。因此,我 return Either[Throwable, String] 没有 return 计算结果并检查先决条件。目前看起来如下:

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

让我感到困惑的是我创建了异常但不抛出它,而是将它存储在 Left 对象中。这是保持引用透明度的常见模式吗?

简而言之,是的。

抛出和捕获异常会扰乱正常的执行流程,因此任何抛出异常的函数都不能是引用透明的。通过 return 将异常 class 实例包装在声明的 return 类型的实例中,您将保留错误状态,并使调用也具有引用透明性。此外,您还允许调用者确定随后会发生什么。

根据您的要求,您可能已经知道,scala.util.Tryscala.util.Either 的另一种选择。有关两者之间差异的更多信息,请参阅 。如果你不关心出现什么异常,scala.Option是另一种可能性。