gpt4 book ai didi

exception - kotlin协程,launch如何处理异常

转载 作者:行者123 更新时间:2023-12-02 13:20:37 25 4
gpt4 key购买 nike

fun main(args: Array<String>) {
runBlocking {

withTimeout(1300L) {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
}

}
}

它崩溃并出现异常:

I'm sleeping 0 ...
I'm sleeping 1 ...
I'm sleeping 2 ...
Exception in thread "main" kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 1300 ms
at kotlinx.coroutines.TimeoutKt.TimeoutCancellationException (Timeout.kt:128)
at kotlinx.coroutines.TimeoutCoroutine.run (Timeout.kt:94)
at kotlinx.coroutines.EventLoopImplBase$DelayedRunnableTask.run (EventLoop.kt:307)
at kotlinx.coroutines.EventLoopImplBase.processNextEvent (EventLoop.kt:116)
at kotlinx.coroutines.DefaultExecutor.run (DefaultExecutor.kt:68)
at java.lang.Thread.run (Thread.java:745)

但是该 block 位于启动

fun main(args: Array<String>) {
runBlocking {
launch {//<===
withTimeout(1300L) {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
}
}//<===
}
}

那么超时也不异常(exception):

I'm sleeping 0 ...
I'm sleeping 1 ...
I'm sleeping 2 ...

为什么launch没有异常?

最佳答案

TimeoutCancellationExceptionCancellationException 的子类。在启动的协程中引发的 CancellationException 不会传播到任何异常处理程序,不会传播到 CoroutineExceptionHandler,也不会传播到线程的未捕获异常处理程序(最后一个在第一个示例中被调用) .

这是第二个示例的修改版本,其中 CancellationException 包装在普通的 RuntimeException (不是 CancellationException 的东西)中。您将再次看到堆栈跟踪日志:

import kotlinx.coroutines.*

fun main(args: Array<String>) {
runBlocking {
launch {
try {
withTimeout(1300L) {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
}
} catch (t: CancellationException) {
throw RuntimeException(t)
}
}
}
}

launch 和 runBlocking 工作方式不同的主要原因是因为 runBlocking 它应该返回值,但是因为作用域被取消,所以没有任何返回值并且它抛出取消异常,对于 launch 它只是取消协程

在这里您可以找到有关协程和异常的更多信息: https://link.medium.com/HEhVwUxOkY

关于exception - kotlin协程,launch如何处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57022019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com