14

現在、URLをフェッチしてそのWebページのHTMLでOption[String]を返そうとするScalaヘルパーメソッドがあります。

例外(不正な形式のURL、読み取りタイムアウトなど)がある場合、または問題がある場合は、Noneを返します。問題は、呼び出し元のコードが例外をログに記録できるように例外をスローする方がよいのでしょうか、それともこの場合はNoneを返すのが望ましいのでしょうか。

4

3 に答える 3

34

スタックトレースを埋める必要があるため、例外の作成にはコストがかかります。例外のスローとキャッチも、通常のリターンよりもコストがかかります。それを考慮して、あなたはあなた自身に次の質問をするかもしれません:

  • 呼び出し元によるエラーの処理を強制しますか?その場合、Scalaには例外をスローしないでください。これは、Scalaには、呼び出し元に例外をキャッチさせるチェック例外メカニズムがないためです。

  • エラーが発生した場合、失敗した理由の詳細を含めますか?そうでない場合は、を返すことができますOption[A]。ここで、Aは戻りのタイプです。その後、追加の説明なしで、Some(validContent)またはのいずれかになります。Noneはいの場合、Either[E, A]またはScalazのようなものを返すことができますValidation[E, A]。このすべてのオプションにより、呼び出し元は、必要に応じてエラーEを自由に処理しながら、結果を何らかの方法でアンラップする必要があります。さて、どうあるべきEですか?

  • 障害が発生した場合にスタックトレースを提供しますか?もしそうなら、あなたは戻ることができEither[Exception, A]ますまたはValidation[Exception, A]。本当に例外を使用する場合は、を使用することをお勧めしますTry[A]。この2つのケースはとです。もちろん、スローアブルを作成するためのコストが発生することに注意してください。そうでない場合は、単に戻ることができます(そして、ここで成功または失敗を意味するかどうかを覚えておくように特に注意してください。通常、エラーに使用され、「正しい」値に使用される方が明確です)。オプションでスタックトレースを返したい場合は、Liftを使用できます。これは、追加の説明なしで使用できます(Failure(exc: Throwable)Success(value: A)Either[String, A]RightLeftRightValidationBox[A]Full(validContents)EmptyOption[A]ここまで)、またはFailureエラー文字列および/またはスロー可能(およびそれ以上)を格納できるを示します。

  • 失敗した理由について複数の指標を提供したいですか?次に、を返しEither[Seq[String], A]ます。Validation[NonEmptyList[String], A]これを頻繁に行う場合は、代わりにScalazを使用することをお勧めします。これにより、他の優れた機能が提供されます。詳細については、検索するか、これらの使用例を確認してください。

于 2011-07-31T17:40:58.973 に答える
1

この場合、例外をログに記録することが重要である場合は、必ず例外をスローしてください(オプションの代わりにStringを返すこともできます)。それ以外の場合は、Noneを返すだけでもかまいません。1つの警告-あなたが予測していない他の理由で例外があるかもしれません、その場合、コードのキャッチオールビットを作ることは危険かもしれません。

あなたができることの1つは、LiftのBoxシステムのようなものです。ボックスは基本的にオプションですが、いくつかの機能が追加されています。AFullは、のようなものでSome、anEmptyはのようなものですNoneが、Liftはさらに一歩進んで、Failureに似てEmptyいますが、理由/メッセージがあります。

于 2011-07-31T17:41:08.333 に答える
0

一般的な経験則は、「例外を処理できる場合は、それを処理する」です。したがって、推測するのに十分なコンテキストがありません。tryFetchUrl/fetchUrlメソッドのペアを使用できます。

于 2011-07-31T17:41:52.570 に答える