0

あるメソッドでいくつかの例外をスローし、別のメソッド セットでエラー コードを返す可能性のある Java ライブラリを使用する必要があります。これまでのところ、次のような醜いコードにつながります

val txn = mgr.prepareTransaction()
val accessRecord = txn.readByQuery(...)
var state : Either[MyError, Result] = null //
try {
  // do something here
  val result = txn.runCodeWithin(new Callable[Result]() {...})
  if (result == -1) {
    state = Left(CanNotReadRecord)
  } else {
    state = Right(txn.getCachedRecord())
  }
} catch {
  case e: Exception => state = Left(GeneralError(e))
} finally {
  state match {
    case Right(_) => txn.commit();
    case _        => txn.rollback();
  }
}

私は主に状態varとして取り除き、finally ブロックで状態をチェックする機能に興味があります。ご意見をお聞かせください。

4

2 に答える 2

4

Scala 2.10 では、Tryのユースケースをより機能的に置き換えるクラスが導入されましたEither[Throwable, Result]。通常のモナド演算 (for 内包表記を機能させるもの) のすべてと、その他の便利なメソッドがいくつかあります。( Try here のドキュメントをご覧ください)

Tryを使用し、 に置き換えCanNotReadRecordて、コードを再実装する可能性がありますCanNotReadRecordException。その置換を除いて、機能的には例と同等である必要があります。

def txResults(txn: Transaction): Try[Record] = for {
    result <- Try{ txn.runCodeWithin(...) }
    checked <- result match {
        case -1 => Failure( new CanNotReadRecordException )
        case _ => Success( txn.getCachedRecord )
    }
} yield checked

txResults(txn) match {
    case Success(record) => txn.commit()
    case Failure(e) => txn.rollback() //and maybe handle `e`
}
于 2013-02-10T04:30:41.683 に答える
3

Scala ARM (Automatic Resource Management) ライブラリは、この種のすべてをエレガントかつ完全に気密に処理します。

見てみな。

于 2013-02-10T01:45:53.810 に答える