是否有其他方法可以编写以下代码?:
val graph: Try[Rdf#Graph] = readGraph(MimeType("text/turtle"),body,url) recoverWith {
case e: Exception => {
readGraph(MimeType("application/rdf+xml"),body,url) recoverWith {
case e: Exception => {
readGraph(MimeType("text/n3"),body,url)
}
}
}
}
我想要一些嵌套块较少的语法,因为我可能需要尝试许多不同的mime类型。有没有办法用for-comprehension做同样的事情?
答案 0 :(得分:4)
也许只是orElse?
scala> import util._
import util._
scala> Try(???) orElse Try(7)
res0: scala.util.Try[Int] = Success(7)
我不认为“第一次成功或者第一次失败”总结得很好;有关期货的类似问题。
如果您在验证一堆值时想要第一次失败,请使用scalaz.\/
。
或简要地说:
implicit class `try lacks toeither`[A](t: Try[A]) {
def toEither: Either[Throwable, A] = Either.cond(t.isSuccess, t.get, t.failed.get)
}
implicit class `either lacks orelse try`[A](e: Either[Throwable, A]) {
def orElse(default: =>Try[A]): Either[Throwable, A] = {
def trymore(t: Throwable): Either[Throwable, A] = (default orElse Failure(t)).toEither
e fold (trymore, _ => e)
}
}
Console println {
Try(null.toString).toEither orElse Try("ok") orElse Try("tried too hard")
}
Console println {
Try(null.toString).toEither orElse Try(throw new RuntimeException("not ok"))
}
//Right(ok)
//Left(java.lang.NullPointerException)
我不能随便告诉它是多么怪诞。