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

Android kotlin Coroutine:await可能会默默地删除异常

万开畅
2023-03-14

在阅读https://developer.android.com/kotlin/coroutines时,我偶然发现了以下警告:

警告:启动和异步处理异常的方式不同。因为async希望最终调用在某个时刻等待,所以它保留异常并作为等待调用的一部分重新抛出它们。这意味着如果您使用await从常规函数启动新的coroutine,您可能会静默地删除异常。这些被删除的异常不会出现在崩溃度量中,也不会在Logcat中被注意到。

共有1个答案

秦鹏飞
2023-03-14

你从Kotlin文档中引用的这段话已经过时了。在实验阶段,这是真的,如果你不是很迂腐,你真的可以得到swallow异常。

coroutines的发布版本获得了一个额外的关键组件:结构化并发。当遵循不使用globalscope等简单准则时,您的代码将自动进行组织,这样每个关联项都有一个父项,并且有一个定义良好的范围,所有关联项都必须在该范围内正常或突然完成,该范围的所有者可以等待其完成,从而获得导致异常完成的异常。

在这个新规程中,LaunchAsync处于相同的地位。如果在其中一个中引发的异常转义了它的顶级块,它将继续取消关联项,并将此通知父级,然后父级可能选择取消所有其他子级,以便整个作用域过早结束。

注意,从await调用获取异常是一种完全不同的机制。您await所依赖的不是Async块本身,而是Deferred类型的独立对象,它与Java的Future相同,只是await挂起而不是挂起块。完成后,Async块始终执行相同的操作:它用返回值或异常完成Deferred。您可以从传递Deferred的任何地方检索结果,它与Async关联项的命运完全分离。

 类似资料:
  • 有一个实体A引用(多对一)实体B,从B到A有反向(映射到)引用。还有一个引用A到C,反向引用C到A。当我发出entitymanager . remove(A)then flush()时,没有生成“delete ”!但是也没有例外。就像根本没有调用remove()一样。为什么会这样?如果在remove()之前我们从反向引用B.listOfA和C.listOfA中提取A,那么“delete”就像预期的

  • 我有一个python dict,我想从我的字典中自动删除和键,所以我想出了如下内容: 如您所见,它的可读性较低,并且导致我编写重复的代码。所以我想知道python中是否有一个方法可以从一个dict中移除任何键,而不会抛出键错误?

  • 问题内容: 在我的JFrame中,我具有默认的咖啡图标。我要删除它。但是当我做setIconImage(null)时不起作用。谁能告诉我有关如何完全删除图标的解决方案 问题答案: 创建由一个像素(更好地透明)组成的图标并使用它。如果您需要这样的图标,请与我联系。我会寄给你。

  • 问题内容: 我以前从未进行过任何认真的Java编码,但是我根据现有技能(Delphi和C#)学习了语法,库和概念。我很难理解的一件事是,我看到如此多的代码在像这样的情况下无声地消耗了异常: 我遇到的几乎每个Java文章和项目中都有类似的代码。根据我的知识,这是非常糟糕的。几乎应该总是将异常转发给外部上下文,如下所示: 在大多数情况下,异常应最终在属于底层框架(例如Java Swing)的最外层循环

  • 问题内容: 我在这里阅读了其他问题 作为删除当前图上轴偏移的一种方法,但是默认情况下有什么方法吗?我在matplotlibrc文件中看不到任何有帮助的东西。 问题答案: 不,没有办法。它在353行的源文件中定义: 作为默认参数值。因此默认值为。 当然,您可以修改源。

  • 如何禁用这两个checkstyle规则文件,使它们不再困扰我?