2017-03-29 7 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.recoverまたはtry.recoverWithの使用に関するTry.recoverWith

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

方法を探していますか?

関連する問題