22

これは基本的に、入力に基づいてアイテムを作成できない場合に例外をスローするJavaファクトリメソッドをラップするためのものです。私は次のようなベースライブラリで何かを探しています:

 def exceptionToOption[A](f: => A):Option[A] ={
    try{
      Some(f)}
    catch{
      case e:Exception => None}
  }

使用法:

val id:Option[UUID] = exceptionToOption(UUID.fromString("this will produce None"))

私は自分で書くことができることを知っていますが、私が車輪の再発明をしていないことを確認したいと思います。

4

5 に答える 5

17

scala.util.control.Exceptionを使用します:

import scala.util.control.Exception._

allCatch opt f

そして、あなたはそれをより洗練させることができます。たとえば、算術例外のみをキャッチして例外を取得するには、次のようにします。

scala> catching(classOf[ArithmeticException]) either (2 / 0)
res5: Either[Throwable,Int] = Left(java.lang.ArithmeticException: / by zero)
于 2011-11-04T19:26:04.160 に答える
11

はい、scala.util.control.Exceptionオブジェクトを確認できます。特に、allCatch機能。

于 2011-11-04T17:52:39.940 に答える
11

scala 2.10以降、コード(ファクトリメソッドなど)をscala.utilで実行できます。試してから、次のコマンドで変換してtoOptionください。

import scala.util.Try
Try("foo".toInt).toOption  // None
Try("7".toInt).toOption    // Some(7)

または、元の例に翻訳します。

val id: Option[UUID] = Try(UUID.fromString("this will produce None")).toOption
于 2014-06-16T12:30:09.087 に答える
1

Scalazは、に類似したValidation [+ E、+A]Eitherを提供します。

val result: Validation[Throwable, Something] = ...

result match {
  case Success(x) => ...
  case Failure(x) => ...
}
于 2011-11-05T17:48:35.207 に答える
0

最近のコンピューターでは、シグナリングと非シグナリングのNaNに基づくパターンを使用しています。NaNは非数を意味します。ゼロ除算(fp)により、NaNが作成されます。sNaNは例外をスローし、非シグナリングNaNは結果として提供されるだけであり、結果に対する将来の計算でもNaNが生成されます。Evaluateはシグナリングであり、TryEvaluateは非シグナリングです。

ここで、Ctx = Context [I、R]は、関数の入力[I]、結果[R]、および例外を保持するコンテキストブロックです。すべてオプションです。コンテキストの更新メソッドはコピー更新です。変化するアップデートではありません。スーパートレイトは、1つ以上の関数を評価し、更新されたコンテキストを次の関数に渡します。メインの評価関数は、例外が保持されている場合(評価をスキップ)にコンテキストを返します。Context [I、R]には、(I => R)を(Context [I、R] => Context [I、R])に変換する関数があります。したがって、通常の関数はコンテキストベースの関数に簡単に変換できます。

ご覧のとおり、コードはそれほど多くありません。特性は私のユーティリティパッケージに含まれており、消費者はほとんどコードなしで使用できます。ライブラリを使用すると、関連する作業のオーバーヘッドが大幅に増加します。

これをすべてのパーサーに使用します。X-Pathベースのパーサーは、一連のサブパーサーを呼び出すだけです。したがって、evaluate(Seq)メソッド。注:私はメソッドが嫌いです。私はできる限り関数を使う傾向があります。

おっと、前回ゴミを投稿したと思います。これがgithubリファレンスです。 https://github.com/tyohDeveloper/acme/tree/master/src/acme/util

于 2019-06-22T20:29:35.453 に答える