- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在这段代码中,为什么 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
中抛出的异常。但我可以告诉你两件事 -
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
,任何直接提供给 CoroutineScope
的 CoroutineExceptionHandler
code> 构造函数或 launch
将在 launch
ed 协程中抛出异常时执行。
希望对您有所帮助!!
更新
我发现了为什么没有捕获异常。看我的回答here .
关于kotlin - 为什么 CoroutineExceptionHandler 没有捕获/处理我的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50191606/
你好,我有一段使用协程的代码,我想对其进行单元测试: 我的问题是我的异常从未被 CoroutineExceptionHandler 捕获。 我的代码如下所示: fun request() {
当我运行这个时: fun f() = runBlocking { val eh = CoroutineExceptionHandler { _, e -> trace("exception h
在这段代码中,为什么 handler 只打印 JobCancellationException 而不是 SocketException 的堆栈跟踪? launch 中的 foo 函数肯定会抛出 Soc
我正在实现一个自定义 Kotlin CoroutineScope,它处理通过 WebSocket 连接接收、处理和响应消息。范围的生命周期与 WebSocket session 相关联,因此只要 We
我是一名优秀的程序员,十分优秀!