获取选项值或抛出exception
给定一个选项,获得它的价值或抛出一个exception尝试的惯用方法是什么?
def foo() : String = { val x : Option[String] = ... x.getOrException() }
(编辑:这不是最好或者最习惯的方法,我不熟悉Scala的时候写的,我把它留在这里作为一个例子,如何不去做,现在我会做@TravisBrown)
我认为这真的归结为两件事情:
- 你有多确定价值在那?
- 如果不是,你想怎么反应 ?
如果在你的代码中的那一点,你期望的价值在那里,在远程的情况下,你不希望你的程序快速失败 ,那么我只会做一个正常的get
,让Scala抛出一个NoSuchElementException
如果有没有价值:
def foo():String = { val x:Option [String] = ... x.get }
如果你想以不同的方式处理案件(抛出你自己的例外情况),我认为更优雅的方式是这样的:
def foo():String = { val x:Option [String] =无 x匹配{ 情况一些(价值)=>价值 case None =>抛出new MyRuntimeException(“blah”) } }
当然,如果您想为Option
为None
的情况提供自己的替代值,则只需使用getOrElse
:
def foo():String = { val x:Option [String] =无 x.getOrElse(“我的替代值”) }
throw
“语句”实际上是Scala中的expression式,它具有Nothing
types,它是每个其他types的子types。 这意味着你可以使用简单的旧的getOrElse
:
def myGet[A](oa: Option[A]) = oa.getOrElse(throw new RuntimeException("Can't."))
不过,你真的不应该这样做。
只需使用.get方法。
def get[T](o:Option[T]) = o.get
如果o是None的一个实例,它将抛出一个NoSuchElementExceptionexception。
基本上,我会select这样的选项:
def addPrint(oi:Option[Int]) = oi.map(_+1).foreach(println) addPrint(Some(41)) addPrint(Some(1336)) addPrint(None)
避免你的具体问题。
我认为这将帮助你留在“function”方面:)
TL; DR
- 抛出
Exception
,以纯粹的function代码信号意外的失败。 - 使用
Option
返回可选值。 - 使用
Option(possiblyNull)
来避免Some(null)
实例。 - 使用
Either
报告预期的失败。 - 使用
Try
而不是返回exception。 - 使用
Try
而不是一个catch块来处理意外的失败。 - 使用
Future
时使用Try
。 - 暴露在公共API中
Try
与检查的exception具有相似的效果。 考虑使用例外。
关于Either
和Try