这种设置有可能吗?

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>
  • 10-01 12:39