如何收集错误是scala的问题,然后将所有错误一起抛出

如何收集错误是scala的问题,然后将所有错误一起抛出,scala,error-handling,jvm,Scala,Error Handling,Jvm,以下是我的功能: val timeComparator: Function[String, String] = new Function[String, String] { def something() { //Does some time calculation } override def apply(element: CharSequence, element1: CharSequence): Any = { if (something(parameter1,

以下是我的功能:

val timeComparator: Function[String, String] = new Function[String, String] {
  def something() {
  //Does some time calculation
  }

  override def apply(element: CharSequence, element1: CharSequence): Any = {
     if (something(parameter1, parameter2)) {
          Left(sys.error("Does not work"))
     } 
  }
}

val callingFunction: Unit = {
  timeComparator(parameter1, parameter2)
}


trait Function[A, B, C] {
  def apply(element : String, element1 :String): Any
}

现在,每当有新数据可用时,都会运行此代码,如果失败,则会抛出一个错误。我如何收集这些错误,而不是处理数据并连续抛出错误,我希望它一起处理所有数据(而不是抛出错误),然后在最后抛出类似“这是一个失败的50个数据点的列表”的东西,本质上是累积错误,而不是在创建错误时抛出错误。我是Scala新手,不太熟悉Scala中的错误处理。

您不能收集多个错误,然后“抛出所有错误”。您可以做的是收集包装在
Try.Failure()中的
Throwable
s

我通常会尝试通过将其插入到您的用例中来演示这个概念,但您的“伪代码”毫无意义,也无法阐明您试图实现的目标。因此,我将提供一个简单的示例,希望您能够将其转移到您的情况中

这里有一个方法可以抛出两种不同类型的错误

def calc(in :Int) :Int =
  if (4/in < 1)                 //can throw ArithmeticException
    throw new Error("too big")  //can throw java.lang.Error
  else
    4 * in
从这里我们可以区分好与坏,并据此采取行动

val (good,bad) = results.partition(_.isSuccess)
report_these_numbers(good.map(_.get))  //Seq(4, 8, 12, 16)
log_these_errors(bad)   //Seq(Failure(java.lang.ArithmeticException: / by zero)
                        //  , Failure(java.lang.Error: too big))

您不能收集多个错误,然后“抛出所有错误”。您可以做的是收集包装在
Try.Failure()中的
Throwable
s

我通常会尝试通过将其插入到您的用例中来演示这个概念,但您的“伪代码”毫无意义,也无法阐明您试图实现的目标。因此,我将提供一个简单的示例,希望您能够将其转移到您的情况中

这里有一个方法可以抛出两种不同类型的错误

def calc(in :Int) :Int =
  if (4/in < 1)                 //can throw ArithmeticException
    throw new Error("too big")  //can throw java.lang.Error
  else
    4 * in
从这里我们可以区分好与坏,并据此采取行动

val (good,bad) = results.partition(_.isSuccess)
report_these_numbers(good.map(_.get))  //Seq(4, 8, 12, 16)
log_these_errors(bad)   //Seq(Failure(java.lang.ArithmeticException: / by zero)
                        //  , Failure(java.lang.Error: too big))

中未闭合的括号(something(parameter1,parameter2)
如果(…)Left else None
没有任何意义,尤其是如果您想返回
单元
的话。请看一看。我确信您已经注意到这是一种伪代码,不要关注文字细节,这段代码只是解释我希望实现的目标。@MilapJhumkhawala虽然我们不需要您的代码,但我们无法帮助您调试我们看不到的代码。在这种情况下,我不知道
某物
返回什么,也不知道为什么一个函数将
单元
作为
任何
返回会很有用。是否有副作用在某个地方发生,而你只想累积错误?你需要有效结果和返回的错误吗?未关闭的paren在
中存在(某物(参数1,参数2)
如果(…)Left else None
没有任何意义,尤其是如果您想返回
单元
的话。请看一看。我确信您已经注意到这是一种伪代码,不要关注文字细节,这段代码只是解释我希望实现的目标。@MilapJhumkhawala虽然我们不需要您的代码,但我们无法帮助您调试我们看不到的代码。在这种情况下,我不知道
某物
返回什么,也不知道为什么将
单元
作为
任何
返回的函数会很有用。是否有副作用在某处发生,而您只想累积错误?您需要有效结果和返回的错误吗?