可能捕获来自不同范围的异常?
Catch exceptions from different scope possible?
这种设置是否可行?
scopeA.launch {
try {
scopeB.launch {
throw SomeException()
}
} catch (e: SomeException) {
// Want to catch here
}
}
你似乎想要矛盾的事情:启动并发协程和暂停当前工作直到它完成,捕获可能的异常。你必须决定你真正想要什么:
如果要并发,那么在子协程内处理异常:
scopeA.launch {
launch(dispatcherB) {
try {
throw SomeException()
} catch (e: SomeException) {
// handle
}
}
}
如果您不想要它,请不要 launch
协程,而是使用 withContext(dispatcherB)
:
scopeA.launch {
try {
withContext(dispatcherB) {
throw SomeException()
}
} catch (e: SomeException) {
// handle
}
}
如果硬要让两个生命周期解耦的协程进行通信,那么也必须引入解耦的通信机制。例如,您可以设置一个 Channel<SomeException>
或 Flow<SomeException>
.
这种设置是否可行?
scopeA.launch {
try {
scopeB.launch {
throw SomeException()
}
} catch (e: SomeException) {
// Want to catch here
}
}
你似乎想要矛盾的事情:启动并发协程和暂停当前工作直到它完成,捕获可能的异常。你必须决定你真正想要什么:
如果要并发,那么在子协程内处理异常:
scopeA.launch { launch(dispatcherB) { try { throw SomeException() } catch (e: SomeException) { // handle } } }
如果您不想要它,请不要
launch
协程,而是使用withContext(dispatcherB)
:scopeA.launch { try { withContext(dispatcherB) { throw SomeException() } } catch (e: SomeException) { // handle } }
如果硬要让两个生命周期解耦的协程进行通信,那么也必须引入解耦的通信机制。例如,您可以设置一个
Channel<SomeException>
或Flow<SomeException>
.