gpt4 book ai didi

kotlin - 为什么 CoroutineExceptionHandler 没有捕获/处理我的异常?

转载 作者:行者123 更新时间:2023-12-02 12:28:08 26 4
gpt4 key购买 nike

在这段代码中,为什么 handler 只打印 JobCancellationException 而不是 SocketException 的堆栈跟踪? launch 中的 foo 函数肯定会抛出 SocketException,那么它会发生什么?

suspend fun foo() {
val job = coroutineContext[Job]!!
val socket = Socket()

job.invokeOnCompletion(onCancelling = true) {
if (!socket.isClosed) {
socket.close()
}
}

// non-routable address -> timeout
// will throw SocketException after socket.close() is called above
socket.connect(InetSocketAddress("10.0.0.0", 1234), 2000)
}

fun test() = runBlocking {
val handler = CoroutineExceptionHandler { _, throwable ->
throwable.printStackTrace()
}

val job = launch(DefaultDispatcher + handler) {
foo()
}

delay(100)
job.cancelAndJoin()
delay(100)
}

最佳答案

我无法告诉您为什么 CoroutineExceptionHandler 没有捕获到 launch 中抛出的异常。但我可以告诉你两件事 -

  1. 我验证了您发现的行为 - 您是对的,没有捕获异常。
  2. 通过实验,我学会了如何在 CoroutineExceptionHandler 中捕获异常。

下面是显示如何捕获它的代码:

fun f() = runBlocking {
val eh = CoroutineExceptionHandler { _, e -> trace("exception handler: $e") }
val cs1 = CoroutineScope(Dispatchers.Default)
val j1 = cs1.launch(eh + CoroutineName("first")) {
trace("launched")
delay(1000)
throw RuntimeException("error!")
}
trace("joining j1")
j1.join()
val cs2 = CoroutineScope(Dispatchers.Default + eh)
val j2 = cs2.launch(CoroutineName("second")) {
trace("launched")
delay(1000)
throw RuntimeException("error!")
}
trace("joining j2")
j2.join()
trace("after join")
}
f()

控制台输出:

[main @coroutine#1]: joining j1
[DefaultDispatcher-worker-1 @first#2]: launched
[DefaultDispatcher-worker-1 @first#2]: exception handler: java.lang.RuntimeException: error!
[main @coroutine#1]: joining j2
[DefaultDispatcher-worker-1 @second#3]: launched
[DefaultDispatcher-worker-3 @second#3]: exception handler: java.lang.RuntimeException: error!
[main @coroutine#1]: after join

关键要点是,如果您在自定义 CoroutineScope 上调用 launch,任何直接提供给 CoroutineScopeCoroutineExceptionHandler code> 构造函数或 launch 将在 launched 协程中抛出异常时执行。

希望对您有所帮助!!

更新

我发现了为什么没有捕获异常。看我的回答here .

关于kotlin - 为什么 CoroutineExceptionHandler 没有捕获/处理我的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50191606/

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