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
。 : - /
答案 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
如果您认为答案不充分,请在您的问题中提供更多背景信息。