我想更新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]
但我觉得这个实现并不优雅,所以我的问题是:
有没有办法更优雅地做到这一点?
答案 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?