2016-10-24 8 views
1
val label = Try("here_a").getOrElse("here_b") 

here_aが見つからない場合、これはhere_bに戻っていません。 .getOrElseが機能しないのはなぜですか?スカラーを試してみよう

ありがとう@jwvh。これらの値はファイルのパスになりますので、例外は次のようになりますException in thread "main" java.io.FileNotFoundException:

Andrew James Ramirezのコメントによれば、私はこれを試しましたが問題は解決しません。

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

は、私はまた、私がSOのためにこの質問を単純化しすぎたかもしれないと思われる編集

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

を試してみました。もう少し文脈。文字列は実際にはファイルパスです。多分これが違いを生み出しているのでしょうか?

実際には、jsonファイルが2つの可能な場所のいずれかにあります。したがって、最初の場所を試してみたい場合は、java.io.FileNotFoundExceptionが返された場合は、2番目の場所に戻ってください。これは私が現在持っているものです。

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

編集 V2

私は、単純な誤りを発見したと言って恥ずかしい思います。私はsparkにこのスカラコードを実行しており、テストの間に再パッケージするのを忘れていました。 sbt packageがすべて必要でした。 :/

+1

どちらの新しい例でも、「here_b」という文字列が返されます。別の結果が得られた場合は、ここで示したコードとは無関係です。 – jwvh

答えて

5

私はあなたが誤解していると思う。そして.getOrElse

試行の定義:

試行タイプは例外が発生し、または正常に計算された値を返すことができるいずれかの計算を表します。それは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は依然として値です。

+0

Andrewに感謝します。どのように一般的な例外はできますか?私の例外は 'FileNotFoundException'であり、' FAIL'を試してみました。運がないと – LearningSlowly

2

Try()リターンのいずれかSuccess(x)またはxが成功した値が返されるとeがスローされた例外であるFailure(e)、。 getOrElse()は、Successをアンラップするか、デフォルト値を指定します。

"OrElse"を取得していない場合、コードでキャッチ可能な例外がスローされません。

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 

この回答が不十分だと思われる場合は、ご質問ください。

+1

ありがとうSynesso。私は恥ずかしがらずに 'sbtパッケージ'を実行するのを忘れてしまった – LearningSlowly

関連する問題