我需要编写应该尝试执行2个操作的代码:
a()
b()
可能会抛出一个错误,我仍然希望b()
发生(最终可以解决这个问题),问题是{{1}}也可能失败,我想要通过两者的描述返回某种聚合异常,实现它的最好方法是什么?
答案 0 :(得分:3)
您可能知道Option
及其子类Some
和None
。 Option
捕获了某些操作的结果可能为空的想法。
类似地,Scala具有Try
及其子类Success
和Failure
,以捕获抛出异常的函数的效果。您可以将a
和b
的调用包装在Try
个对象中,然后可以使用类Try
中提供的方法对其进行操作。例如:
import scala.util.{Try, Success, Failure}
def getExceptionMessage[U](t: Try[U]): Option[String] = t match {
case Success(_) => None
case Failure(x) => Some(x.getMessage)
}
def foo(): Unit = {
// If a() throws an exception, aa will become a Failure, otherwise a Success
val aa = Try(a())
val bb = Try(b())
val errors = List(getExceptionMessage(aa), getExceptionMessage(bb)).flatten
if (!errors.isEmpty) throw new Exception(errors.toString)
}
答案 1 :(得分:2)
简单又好看:
val exc = List(Try(a), Try(b)) collect { case Failure(ex) => ex }
作为结果,您将获得Throwable
的列表(可能为空)。