获取Option值或抛出异常

时间:2013-04-28 13:53:49

标签: scala

给定一个Option,获取其值或尝试异常的惯用方法是什么?

def foo() : String = {
  val x : Option[String] = ...
  x.getOrException()
}

5 个答案:

答案 0 :(得分:114)

throw“语句”实际上是Scala中的表达式,它具有类型Nothing,它是所有其他类型的子类型。这意味着您可以使用普通的getOrElse

def myGet[A](oa: Option[A]) = oa.getOrElse(throw new RuntimeException("Can't."))

但你真的,真的不应该这样做。

答案 1 :(得分:39)

(编辑:这不是最好的或最惯用的方式。我在不熟悉Scala的时候写了它。我把它留在这里作为如何做的例子现在我会做@TravisBrown)

我认为它归结为两件事:

  • 肯定你的价值在哪里?
  • 如果不是如何做出反应

如果在您的代码中的那一点,您期望值,那么在远程情况下,您不希望您的程序快速失败,然后我只会做一个正常的get,如果没有值,Scala会抛出NoSuchElementException

def foo() : String = {
  val x : Option[String] = ...
  x.get
}

如果你想以不同的方式处理这个案例(抛出你自己的异常),我认为更优雅的方式是这样的:

def foo(): String = {
  val x: Option[String] = None
  x match {
    case Some(value) => value
    case None => throw new MyRuntimeException("blah")
  }
} 

当然,如果您想为OptionNone的情况提供自己的替代值,则只需使用getOrElse

def foo(): String = {
  val x: Option[String] = None
  x.getOrElse("my alternative value")
} 

答案 2 :(得分:13)

只需使用.get方法即可。

def get[T](o:Option[T]) = o.get

如果o是None的实例,它将抛出NoSuchElementException。

基本上,我会使用这样的选项:

def addPrint(oi:Option[Int]) = oi.map(_+1).foreach(println)
addPrint(Some(41))
addPrint(Some(1336))
addPrint(None)

避免您的具体问题。

答案 3 :(得分:7)

我认为这将有助于您继续保持"功能性"方:):

TL; DR

  • 抛出Exception以表示纯功能代码中的意外故障。
  • 使用Option返回可选值。
  • 使用Option(possiblyNull)来避免Some(null)
  • 的实例
  • 使用Either报告预期的失败。
  • 使用Try而非Either返回例外。
  • 使用Try而非catch块来处理意外故障。
  • 使用Try时使用Future
  • 在公共API中公开Try与检查异常具有类似的效果。请考虑使用例外。

关于EitherTry

答案 4 :(得分:0)

Scala现在支持使用getOrElse()方法在地图上进行此操作,请参见documentation here

正如已经指出的那样,在Scala中引发异常也是一个表达式。

因此您可以执行以下操作:

myMap.getOrElse(myKey, throw new MyCustomException("Custom Message HERE")