Вы можете упаковать свой MyException
с одним или обоими «подавленными» исключениями.
val myEx = new MyException("my exception")
myEx.addSuppressed(error1)
myEx.addSuppressed(error2)
throw myEx
Тогда нужно перехватить код, чтобы распаковать его.
case err : MyException =>
val arr :Array[Throwable] = err.getSuppressed
// arr contains all the "suppressed" exceptions that were added,
// stack traces and all
Тем не менее, возможно, лучше выразить возможность ошибки в системе типов, чем оставить (возможно, несуществующий) код перехвата, чтобы сделать правильную вещь.
import util.Try
val res :Either[List[Throwable],String] =
Try(foo).fold(fErr =>
Try(bar).fold(bErr => Left(fErr::bErr::Nil), _ => Left(fErr::Nil))
, Right(_))
Оттуда вы можете продолжить по мере необходимости.
res match {
case Right(s) => println(s) //foo result string
case Left(lst) =>
println(lst.map(_.getMessage()).mkString(",")) //foo method fails,bar method fails
lst.foreach(_.printStackTrace()) //both stack traces
}