Scala:投掷错误与返回尝试?

cla*_*lay 11 scala

Scala API是否应该理想地抛出异常或返回Try值?有关于此的官方指南吗?

def doSomethingMayThrow(): A = ???
def doSomethingWontThrow(): Try[A] = ???
Run Code Online (Sandbox Code Playgroud)

Gab*_*lla 14

永远不要抛出可恢复错误的异常.

返回表示可能的失败(a Future,a Try,an Either等)的适当数据结构总是比在野外抛出异常更可取.它将告知调用者失败的可能性,并将强制他们进行管理.

只应针对不可恢复的错误抛出异常,例如硬件故障等.

我们举一个例子:

def throwOnOdds(x: Int): Int =
   if (x % 2 == 0) x / 2 else throw new Exception("foo")

val x = throwOnOdds(41) + 2 // compiles and explodes at runtime
Run Code Online (Sandbox Code Playgroud)

现在,让我们做得更好

def throwOnOdds(x: Int): Try[Int] =
   if (x % 2 == 0) Success(x / 2) else Failure(new Exception("foo"))

val x = throwOnOdds(41) + 2 // doesn't compile
Run Code Online (Sandbox Code Playgroud)

不处理失败会导致编译时错误,这比运行时错误要好.这是如何处理它

throwOnOdds(41) match {
  case Success(n) => // do something with n
  case Failure(e) => // handle exception
}
Run Code Online (Sandbox Code Playgroud)