尝试使用for-comprehension语法recoverWith?

时间:2014-03-19 16:06:10

标签: scala

是否有其他方法可以编写以下代码?:

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做同样的事情?

1 个答案:

答案 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)

我不能随便告诉它是多么怪诞。