gpt4 book ai didi

scala - 斯卡拉 future : possible to find out if an 'onFailure' callback has been installed (so we can implement default error handling)?

转载 作者:行者123 更新时间:2023-12-03 08:53:54 26 4
gpt4 key购买 nike

我的问题与this question有关Scala future 的默认错误处理程序有关。

问题是,我想安装一个默认的错误处理程序,该处理程序仅在没有onFailure(或onComplete)时才启动
回调已安装在Future上。我认为这将非常有用,因为我有
我的 future 默默失败的书面代码,让我对正在发生的事情感到困惑。
后备错误处理程序将使我能够轻松识别错误的 future ,
从未定义适当的onFailure回调。

下面是一个代码示例,说明了在哪里有用。

  import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent._
import scala.language.implicitConversions
import scala.language.postfixOps

def futureWithLogging[T](fut: Future[T]) =
fut.transform(identity, { t: Throwable =>
Console.err.println(s"failed with $t")
t
})


{
val f = futureWithLogging ( Future {
Thread.sleep(1000)
throw new scala.RuntimeException("")
} )

f.onFailure{ case err:Throwable => {println("custom error message"); err.printStackTrace()} }

println(s"future value is: ${f.value}")
Thread.sleep(1000)
println(s"future value is now: ${f.value}")
Thread.sleep(1000)
}

请注意,我有一个
futureWithLogging函数,该函数在将来的任何将来安装一些默认的错误处理行为
您传递给函数。现在,如果我忘了将来安装onFailure,这将非常方便。
但是在上面的代码中,您看到我在Future'f'上安装了onFailure处理程序。
结果是我的日志中出现噪音。我看到两个错误消息:
  failed with <exception>  


   custom error message...

在这种情况下,我只想看第二个

您可以提供的任何指导都将不胜感激!

最佳答案

我最想得到的是,对于任何特定的故障处理程序,将异常包装在特殊的“HandledException”包装程序中,默认故障处理程序可以专门处理(忽略或打印合适的消息,等等)。例如:

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent._
import scala.language.implicitConversions
import scala.language.postfixOps

case class HandledException(inner: Throwable) extends RuntimeException(inner)

def futureWithLogging[T](fut: Future[T]) =
fut.transform(identity, { t: Throwable =>
Console.err.println(s"failed with $t")
HandledException(t)
})


{
val f = futureWithLogging ( Future {
Thread.sleep(1000)
throw new scala.RuntimeException("")
} )

f.onFailure {
case HandledException(inner) => println("Already handled: "+inner)
case err:Throwable => {println("custom error message"); err.printStackTrace()}
}

println(s"future value is: ${f.value}")
Thread.sleep(1000)
println(s"future value is now: ${f.value}")
Thread.sleep(1000)
}

从这里,您可以在“HandledException”类中添加一个问题ID,该问题ID可以在第一次捕获到初始异常的地方打印出来,然后传递到前端(并且有可能在打印时以简写形式出现) (例如默认处理程序),并向用户显示“抱歉,我们遇到了错误-您可以给我们的支持人员发送电子邮件,并在问题ID'...'寻求帮助”或任何您喜欢的信息。该ID可以存储在数据库中,可以通过日志文件进行跟踪(如果需要,可以放入日志框架的诊断上下文中),等等。

关于scala - 斯卡拉 future : possible to find out if an 'onFailure' callback has been installed (so we can implement default error handling)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33063074/

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