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)