gpt4 book ai didi

scala - 如何收集错误是scala,然后将所有错误汇总在一起

转载 作者:行者123 更新时间:2023-12-03 08:10:43 25 4
gpt4 key购买 nike

这是我的功能:

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中的错误处理不太熟悉。

最佳答案

您无法收集多个错误,然后“全部抛出”。您可以做的是收集包裹在Throwable中的Try.Failure()

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

这是一种可以引发两种不同类型错误的方法。

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

让我们改变它。让我们返回错误,而不是抛出错误。
import util.Try

def calc(in :Int) :Try[Int] = Try{
if (4/in < 1) //can throw ArithmeticException
throw new Error("too big") //can throw java.lang.Error
else
4 * in
}

现在让我们提供一些数据。
val data = 0 to 5
val results = data.map(calc)
//results: Seq[Try[Int]] = Seq(Failure(java.lang.ArithmeticException: / by zero)
// , Success(4), Success(8), Success(12), Success(16)
// , Failure(java.lang.Error: too big))

从这里我们可以区分好与坏,并采取相应的行动。
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))

关于scala - 如何收集错误是scala,然后将所有错误汇总在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51866268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com