2017-03-29 27 views
1

我想更新一個失敗例外嘗試提供一個更容易理解的失敗。如何優雅地更新Try的Failure異常?

我成功地做到這一點通過以下實現:

case class NoDataAvailableException() extends Exception 

[...] 

    Try(...) match { 
     case Success(f) => Success(f) 
     case Failure(_) => Failure(NoDataAvailableException()) 
    } 

但我覺得這個實現是不是真的優雅,所以我的問題是:

有沒有辦法做到這一點更優雅?

回答

3

您可以使用recoverWith並接受PartialFunction[Throwable, Try[U]]。如果您願意,這將允許您將特定的例外映射到成功或失敗。

case class MyException() extends Exception 

Try(1/0) recoverWith { 
    case _: ArithmeticException => Failure(new MyException()) 
    // other exceptions ... 
} 

你也可以使用一個隱含的類來添加自己的方法來Try,讓你專門映射例外。

implicit class TryExtension[A](t: Try[A]) { 
    def mapFailure(pf: PartialFunction[Throwable, Throwable]): Try[A] = 
     t.recoverWith(pf.andThen(Failure.apply)) 
} 

scala> Try(1/0).mapFailure { case _ => new MyException } 
res3: scala.util.Try[Int] = Failure(MyException) 
2

您正在尋找Try.recoverWith

Try(...) recoverWith { 
    case _ => Failure(NoDataAvailableException()) 
} 
2

如何使用try.recover或try.recoverWith?