给定一个Option,获取其值或尝试异常的惯用方法是什么?
def foo() : String = {
val x : Option[String] = ...
x.getOrException()
}
答案 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") } }
当然,如果您想为Option
为None
的情况提供自己的替代值,则只需使用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)
我认为这将有助于您继续保持"功能性"方:):
Exception
以表示纯功能代码中的意外故障。Option
返回可选值。Option(possiblyNull)
来避免Some(null)
。Either
报告预期的失败。 Try
而非Either
返回例外。 Try
而非catch块来处理意外故障。 Try
时使用Future
。Try
与检查异常具有类似的效果。请考虑使用例外。答案 4 :(得分:0)
Scala现在支持使用getOrElse()
方法在地图上进行此操作,请参见documentation here
正如已经指出的那样,在Scala中引发异常也是一个表达式。
因此您可以执行以下操作:
myMap.getOrElse(myKey, throw new MyCustomException("Custom Message HERE")