当前位置: 首页 > 知识库问答 >
问题:

捕捉Scala futures中未处理的错误

章振
2023-03-14

如果 Scala 未来失败,并且没有延续“观察到”该故障(或者唯一的延续使用 map/flatMap 并且在发生故障时不运行),那么错误就不会被发现。我希望至少记录这些错误,以便我可以找到错误。

我使用术语“观察到的错误”,因为在.Net Tasks中,当GC收集Task对象时,有机会捕获“未观察到的任务异常”。同样,使用同步方法,可以记录终止线程的未捕获异常。

在Scala futures中,“观察”到一个失败意味着在未来被释放之前,一些延续或其他代码读取了存储在未来值中的异常。我知道终结是不确定或不可靠的,这大概就是为什么它不被用来捕捉未处理的错误。Net在这方面做得很成功。

在Scala中有办法实现这一点吗?如果不是,我应该如何组织我的代码来防止未处理的错误?

今天,我将<code>和第二个检查结果</code>附加到各种期货中。但很难知道何时使用该方法,何时不使用:如果库方法返回未来,它不应该检查结果并记录错误本身,因为库用户可能会处理故障,因此责任落在用户身上。当我编辑代码时,有时需要添加检查,有时需要删除检查,这种手动管理肯定是错误的。

共有2个答案

章绪
2023-03-14

您可以在返回 Future 的函数中使用 Future.recover

例如,在最简单的情况下,您可以“记录”错误并重新抛出原始异常:

def libraryFunction(): Future[Int] = {
   val f = ...
   f.recover {
      case NonFatal(t) =>
         println("Error : " + t)
         throw t
   }
}

请注意使用nonFial来匹配所有可以捕获的异常类型。
如果您愿意,该恢复块可以同样返回替代结果。

方河
2023-03-14

我的结论是,在Scala futures中没有办法普遍注意到未处理的错误。

 类似资料:
  • 我的数据服务如下所示: 如果我得到一个HTTP错误(即404),我会从core得到一条令人讨厌的控制台消息:error error:Uncaught(promise):[object]。es5。在我的情况下,我该如何处理?

  • 问题内容: 我知道可可中有一个UncaughtExceptionHandler,但是我正在为Swift寻找相同的东西。即,每当应用程序中有任何错误/异常由于任何错误而未在本地捕获时,它应该一直冒泡到顶级应用程序对象,在那里我应该能够妥善处理它并适当地响应用户。 Android有它。Flex有它。Java有它。想知道为什么Swift缺少此关键功能。 问题答案: Swift没有机制来捕获所有任意的运行

  • 问题内容: 我听说捕捞被认为是不好的作法。我当前正在加载一个不能保证在PATH上的.dll,并希望在不存在的情况下切换到用户配置的位置。 有更好的方法吗?还是在这里接受是可以接受的? 问题答案: 除了提供有关如何从技术上解决问题的建议以外,我想花点时间解释一下为什么它首先被认为是“不好的做法”。 让我们从澄清什么是类开始。 在Java中,将引发错误和异常(它们是主要类型)。通过使用关键字可以完成上

  • 我定义了一个自定义错误处理程序,它捕获所有异常并将其保存到日志中。现在,如果我在mysqli查询中出现语法错误,例如打字错误,页面将完全停止加载。没有引发异常,因此不会触发错误处理程序,也不会记录任何内容。 这正常吗?我是否应该检查PHP设置来修复此问题,以便任何mysqli查询错误都会引发异常? (如果查询返回0个结果,我不希望引发异常-仅当它由于键入错误或查询结构中的其他错误而出错时) 查询示

  • 我正在开发一个django应用程序,它可以与几个Amazon Web服务进行通信。 到目前为止,我在处理和捕获boto3客户端抛出的异常方面遇到了困难。我正在做的事情似乎不必要地单调乏味: 例子: 如果令牌坏了,这可能会抛出一个。 可能会抛出一个。 首先,我在代码中的任何地方都找不到这些错误,所以它们可能是在某个地方生成的。一句话:我不能像往常一样导入和捕获它。 其次,我发现了一种方法来捕获错误这

  • 6.1. 浏览您捕捉的包 在你已经捕捉完成之后,或者打开先前保存的包文件时,通过点击包列表面版中的包,可以在包详情面板看到关于这个包树状结构以及字节面版 通过点击左侧"+"标记,你可以展开树状视图的任意部分。你可以在面板点击任意字段来选择它。例如:在下图图 6.1 “Wireshark选择了一个TCP包后的界面”显示的就是选中TCP字段。同样可以选择TCP包头的应答号(ack:190),同时会出现