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]. 它包含所有常见的 monad 操作(使理解起作用的东西)和一些其他有用的方法。(在这里查看 Try 的文档

这是您的代码的可能重新实现,使用Try并替换CanNotReadRecordCanNotReadRecordException. 除了替换之外,它应该在功能上与您的示例等效。

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 (自动资源管理)库以一种完全密封的方式优雅地处理所有这些事情。

看看这个。

于 2013-02-10T01:45:53.810 回答