获取选项值或抛出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”)
   }
 } 

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

 def foo():String = {
   val x:Option [String] =无
   x.getOrElse(“我的替代值”)
 } 

throw “语句”实际上是Scala中的expression式,它具有Nothingtypes,它是每个其他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具有相似的效果。 考虑使用例外。

关于EitherTry