Scala的Try类型如何在引擎盖下工作?

时间:2014-12-23 18:26:18

标签: scala

似乎Try没有表现出我能够捕捉异常的类型的行为。我看了at the source code,但仍然不知道它是如何工作的。

是否使用了一些我不熟悉的Scala功能,或者是否由编译器专门处理?

3 个答案:

答案 0 :(得分:7)

这里没什么特别的。查看apply方法:

def apply[T](r: => T): Try[T] =
    try Success(r) catch {
      case NonFatal(e) => Failure(e)
    }

它只是通过尝试返回try来包裹catch / Success(r),如果失败,则会返回Failure(e)

答案 1 :(得分:1)

一切都在那里:

https://github.com/scala/scala/blob/2.11.x/src/library/scala/util/Try.scala#L192

def apply[T](r: => T): Try[T] =
  try Success(r) catch {
    case NonFatal(e) => Failure(e)
}

答案 2 :(得分:0)

  import scala.util._
  import scala.util.control.NonFatal

接下来的3行将在apply对象上使用相同的scala.util.Try方法:

  val res = Try.apply(throw new Exception)
  val res2 = Try(throw new Exception)
  val res3 = Try { throw new Exception }

具有以下定义:

  def apply[T](r: => T): Try[T] =
    try Success(r) catch {
      case NonFatal(e) => Failure(e)
    }
  1. apply方法使用ByName参数r定义,即 仅在使用时评估。在我们的例子中,它将在try块中使用 为Success(r)
  2. 按照Scala中的惯例,您可以使用括号 调用对象的apply方法。
  3. 也可以按惯例使用 花括号将一个参数传递给方法。