从Option转换为Try

时间:2015-12-06 10:16:10

标签: scala error-handling

最近我发现自己编写了一个通用实用程序,将Option转换为scala.util.Try,如下所示:

implicit class OptionTry[A](oa: Option[A]) extends AnyVal {

  def asTry[E <: Exception](e: E): Try[A] = oa match {
    case Some(a) => Success(a)
    case None    => Failure(e)
  }

  def asTry(msg: String): Try[A] = asTry(new Exception(msg))
}

现在我想知道为什么标准库没有提供它。我错过了什么吗?

2 个答案:

答案 0 :(得分:4)

正如克里斯·马丁已经暗示过,区别在于语义。

None - 类型来说,Option并不例外,这是预期的行为。

因此,从Option转换为Try可以被视为一种特殊行为,其中没有标准方法来表达适合所有用户的内容。提示可能是您需要在转换器函数中给出预期的Exception。

一个合适的解决方案可能是改变返回Option的实现而不是使用Try,而不是之后添加行为。 (如果这是可能的,而不是隐式类的整个原因;))

答案 1 :(得分:3)

这个问题可能是偏离主题的,因为除了意见或猜测之外我没有其他答案,但这是我的推测。

引入了

Try以提供try - catch语法的替代方法。 Scala世界中的例外情况有点令人不悦,Try可以帮助您处理抛出的API,而不是鼓励您使用异常。

Either可能比Try更合适的情况下,您似乎正在使用此功能。例如,我建议o.asTry("xyz")建议Try[A]而不是写o.toRight("xyz")来获取Either[String, A]