Coroutines CancellationException expected behaviour
因此基于Kotlin对协程的介绍,在取消和超时->运行不可取消的块中,我找到以下解释:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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.") } |
记录结果:
1 2 3 4 5 | 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. |
最后一个块可能不执行,可能是由于在其中运行了暂停功能,但是我希望在运行
1 2 3 4 5 | try { runPlayground() } catch (e: CancellationException) { Log.d("XXX", e.message) } |
协程内部是否处理了异常?
从
如果您在上面的链接下研究文档,您将了解到,由于该异常是
1 2 3 4 5 6 | fun main() = runBlocking { launch(Job()) { throw Exception("I failed") }.join() println("runBlocking done") } |
此打印
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 |
尤其要注意
当我去测试与上面类似的代码,但是安装了
我为此创建了一个问题。