Vla*_*kov 5 cancellation kotlin kotlin-coroutines
假设我们有一个琐碎的“使用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() {
println("test.begin")
try {
delay(5000)
} catch (e: TimeoutCancellationException) {
// It is important to throw an exception different from CancellationException
throw RuntimeException("delay was cancelled", e) // <-- line 9
}
println("test.end")
}
fun main() {
runBlocking { // <-- line 15
withTimeout(100) {
test()
}
}
}
Run Code Online (Sandbox Code Playgroud)
Exception in thread "main" java.lang.RuntimeException: delay was cancelled
at FileKt.test (File.kt:9) // throw RuntimeException
at FileKt$test$1.invokeSuspend (File.kt:-1)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run (Dispatched.kt:334)
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 (:1)
at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default (Builders.kt:36)
at kotlinx.coroutines.BuildersKt.runBlocking$default (:1)
at FileKt.main (File.kt:15) // runBlocking
at FileKt.main (File.kt:-1)
Caused by: java.lang.RuntimeException: delay was cancelled
at FileKt.test(File.kt:9) // throw RuntimeException
at FileKt$test$1.invokeSuspend(File.kt:-1)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:334)
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(:1)
at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:36)
at kotlinx.coroutines.BuildersKt.runBlocking$default(:1)
at FileKt.main(File.kt:15) // runBlocking
at FileKt.main(File.kt:-1)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
86 次 |
最近记录: |