我正在设计一个返回的方法,并希望保持引用透明度。因此,我返回Either[Throwable, String]
而不是返回结果并检查前置条件。目前看来如下:
def logName(arg: String): Either[Throwable, String] =
if (arg.lenght < 5)
Right(arg)
else
Left(new IllegalArgumentException(s"Illegal lenght"))
我感到困惑的是我创建了异常并且不抛出它,而只是将它存储在Left
对象中。这是保护参照透明度的常见模式吗?
答案 0 :(得分:2)
简而言之,是的。
抛出和捕获异常会破坏正常的执行流程,因此抛出异常的任何函数都不能被引用透明。通过返回包含在声明的返回类型的实例中的异常类实例,您将保留错误状态,并使调用也引用透明。此外,您允许呼叫者确定随后会发生什么。
根据您的要求,您可能已经知道,scala.util.Try
是scala.util.Either
的另一种选择。有关两者之间差异的更多信息,请参阅this answer to "What is the difference between Try and Either?"。如果您不关心出现什么异常,scala.Option
是另一种可能性。