聚合多个错误

时间:2016-06-21 09:09:54

标签: scala

我需要编写应该尝试执行2个操作的代码:

a()

b()可能会抛出一个错误,我仍然希望b()发生(最终可以解决这个问题),问题是{{1}}也可能失败,我想要通过两者的描述返回某种聚合异常,实现它的最好方法是什么?

2 个答案:

答案 0 :(得分:3)

您可能知道Option及其子类SomeNoneOption捕获了某些操作的结果可能为空的想法。

类似地,Scala具有Try及其子类SuccessFailure,以捕获抛出异常的函数的效果。您可以将ab的调用包装在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的列表(可能为空)。