小编Vla*_*kov的帖子

有没有办法了解协程被取消后在做什么?

假设我们有一个琐碎的“使用timout取消”案例(Kotlin 1.3.50,kotlinx-coroutines-core 1.3.2):

import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.delay
import kotlinx.coroutines.withTimeout

suspend fun test() {
    println("test.begin")
    delay(5000)
    println("test.end")
}

fun main() {
    runBlocking {
        withTimeout(100) {
            test()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望该异常包含类似main和的函数名称test。异常可能包含协程堆栈跟踪。

但是,实际上结果如下:

Exception in thread "main" kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 100 ms
 at kotlinx.coroutines.TimeoutKt.TimeoutCancellationException (Timeout.kt:126) 
 at kotlinx.coroutines.TimeoutCoroutine.run (Timeout.kt:92) 
 at kotlinx.coroutines.EventLoopImplBase$DelayedRunnableTask.run (EventLoop.common.kt:491) 
 at kotlinx.coroutines.EventLoopImplBase.processNextEvent (EventLoop.common.kt:270) 
 at kotlinx.coroutines.DefaultExecutor.run (DefaultExecutor.kt:68) 
 at java.lang.Thread.run (Thread.java:745) 
Run Code Online (Sandbox Code Playgroud)

有没有办法使取消例外同时包含“取消和协程堆栈轨迹”?

更新:CancellationException可以检测到try-catch,但是,我不想try-catch每次suspendable fun通话:

import kotlinx.coroutines.*

suspend fun test() { …
Run Code Online (Sandbox Code Playgroud)

cancellation kotlin kotlin-coroutines

5
推荐指数
0
解决办法
86
查看次数

标签 统计

cancellation ×1

kotlin ×1

kotlin-coroutines ×1