你可以收拾行李
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
}