尝试和getOrElse scala

时间:2016-10-24 06:58:08

标签: scala

val label = Try("here_a").getOrElse("here_b")

如果找不到here_a,则不会回退到here_b。为什么.getOrElse无效?

谢谢@jwvh。这些值是sting文件路径,因此例外是以下Exception in thread "main" java.io.FileNotFoundException:

根据安德鲁·詹姆斯·拉米雷斯的评论,我试过这个,但问题仍然存在。

Try(throw new Exception("FAIL here_a")).getOrElse("here_b")

我也试过

Try(throw new Exception("FileNotFoundException here_a")).getOrElse("here_b")

修改

似乎我可能为SO过分简化了这个问题。更多背景。该字符串实际上是一个文件路径。也许这有所作为?

实际上,可以在两个可能的位置之一中找到json文件。因此,我希望尝试第一个位置,如果返回java.io.FileNotFoundException,则返回第二个位置。这就是我现在所拥有的:

val input_file = Try(throw new Exception("FAIL location_a/file_a.json")).getOrElse("location_b/file_a.json")

编辑 V2

我很尴尬地说我发现了一个简单的错误。我在spark上运行此scala代码,我忘了在测试之间重新打包。只需要sbt package。 : - /

3 个答案:

答案 0 :(得分:6)

我觉得你误解了Try。和.getOrElse

尝试的定义:

  

Try类型表示可能导致异常或返回成功计算值的计算。它与scala.util.Either类型相似,但在语义上不同。

scala> Try("here_a")
res1: scala.util.Try[String] = Success(here_a)

scala> Try("here_a").get
res2: String = here_a

scala> Try(throw new Exception("FAIL here_a")).getOrElse("here_b")
res3: String = here_b

scala> 

只有在抛出异常时才会失败。 null仍然是一个值。

答案 1 :(得分:2)

Success(x)返回Failure(e)x,其中e是返回的成功值,getOrElse()是抛出的异常。 Success打开date()或提供默认值。

如果你没有得到" OrElse"那么你的代码就不会抛出可捕获的异常。

答案 2 :(得分:1)

它按预期的那样工作。

$ scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_40).
Type in expressions for evaluation. Or try :help.

scala> val label = Try(throw new RuntimeException("here_a")).getOrElse("here_b")
label: String = here_b

如果您认为答案不充分,请在您的问题中提供更多背景信息。