2014-03-19 56 views
3

有另一種方式來寫下面的代碼?:嘗試recoverWith與理解語法?

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類型。有沒有辦法使用理解來做同樣的事情?

回答

4

也許只是或者?

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) 

我不能告訴副手這是多麼荒唐。

+0

這是正確的哈哈哈如此輕鬆。 –

+0

以及如果我需要保持第一次失敗而不是最後一次,以防萬一所有嘗試失敗? –