作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,基于Kotlin对协程的介绍,在Cancellation and Timeouts -> Run non-cancellable block中,我找到了以下解释:Any attempt to use a suspending function in the finally block [...] causes CancellationException
,但在运行时:
fun runPlayground() = runBlocking {
val job = launch {
try {
repeat(1000) { i ->
Log.d("XXX", "job: I'm sleeping $i ...")
delay(500L)
}
} finally {
doWorld() // logs "World" after 1s delay
delay(2000L)
Log.d("XXX", "job: I'm running finally")
}
}
delay(1300L) // delay a bit
Log.d("XXX", "main: I'm tired of waiting!")
job.cancelAndJoin() // cancels the job and waits for its completion
Log.d("XXX", "main: Now I can quit.")
}
D/XXX: job: I'm sleeping 0 ...
D/XXX: job: I'm sleeping 1 ...
D/XXX: job: I'm sleeping 2 ...
D/XXX: main: I'm tired of waiting!
D/XXX: main: Now I can quit.
CancellationException
:
try {
runPlayground()
} catch (e: CancellationException) {
Log.d("XXX", e.message)
}
最佳答案
从doWorld()
抛出该异常,从那时起,它逃脱了协程块并被静默吞下,因为您尚未安装任何未处理的exception handler。运行该调度程序不会由于该异常而崩溃。
如果您在上面的链接下学习文档,您将了解到该异常只是因为是CancelationException
而被默默地吞下了。任何其他异常至少会以与未处理的异常出现在Java线程中相同的方式显示,例如:
fun main() = runBlocking {
launch(Job()) {
throw Exception("I failed")
}.join()
println("runBlocking done")
}
Exception in thread "main" java.lang.Exception: I failed
at org.mtopol.TestingKt$main$1$1.invokeSuspend(testing.kt:8)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:241)
at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:270)
at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:79)
at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:54)
at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)
at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:36)
at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)
at org.mtopol.TestingKt.main(testing.kt:6)
at org.mtopol.TestingKt.main(testing.kt)
runBlocking done
main
线程实际上并没有死:它继续打印
runBlocking done
行。 Kotlin只是重复使用已安装的
currentThread().uncaughtExceptionHandler()
来记录协程失败。
CoroutineExceptionHandler
时,我发现了一些问题:
runBlocking
似乎有一个错误,即使您为其安装了处理程序,也不会运行。 关于android - 协程CancellationException预期行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59562173/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!