如何优雅地更新Try的Failure异常?

时间:2017-03-29 15:41:44

标签: scala try-catch

我想更新Try的Failure异常以提供更容易理解的失败。

我通过使用以下实现成功地完成了这项工作:

# qs [5;43;1;10;2];;
1 2  <<5>> 43 10 
10   <<43>> 
     <<10>> 
     <<1>> 2 
     <<2>> 
- : int list = [1; 2; 5; 10; 43]

但我觉得这个实现并不优雅,所以我的问题是:

有没有办法更优雅地做到这一点?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

您正在寻找Try.recoverWith

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

答案 2 :(得分:2)

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