【问题标题】:Catch exceptions from different scope possible?可能从不同范围捕获异常?
【发布时间】:2020-01-07 13:31:23
【问题描述】:

这种设置有可能吗?

scopeA.launch {
    try {
        scopeB.launch {
            throw SomeException()
        }
    } catch (e: SomeException) {
        // Want to catch here
    }
}

【问题讨论】:

标签: kotlin coroutine kotlin-coroutines


【解决方案1】:

您似乎希望得到一些矛盾的东西:两者都启动并发协同程序暂停当前工作直到它完成,捕获可能的异常。你必须决定你真正想要什么:

  1. 如果你想要并发,那么在子协程中处理异常:

    scopeA.launch {
        launch(dispatcherB) {
            try {
                throw SomeException()
            } catch (e: SomeException) {
                // handle
            }
        }
    }
    
  2. 如果你不想要它,不要 launch 协程而是使用 withContext(dispatcherB) 代替:

    scopeA.launch {
        try {
            withContext(dispatcherB) {
                throw SomeException()
            }
        } catch (e: SomeException) {
            // handle
        }
    }
    
  3. 如果您确实希望两个具有解耦生命周期的协程进行通信,则还必须引入解耦通信机制。例如,您可以设置Channel<SomeException>Flow<SomeException>

【讨论】:

  • 难道没有不同范围有意义的情况吗?例如,scopeA 在 Activity 的生命周期内处于活动状态,而 scopeB 在已建立的蓝牙连接期间处于活动状态。 scopeB 会做蓝牙 io 的工作,直到断开连接(范围取消)。 scopeA 和 scopeB 都应该使用主调度器,但有不同的生命周期。
  • 如果您在问题中包含了用例,那就太好了。
  • 我试图将问题简化为给出两个范围的要点。我仍在尝试根据您的回答重新考虑我的设计。
  • 我有一个想法可以解决您的问题:建立一个Channel<Exception>,以便您可以向另一方发出异常信号。它也可以与Flow一起使用。
猜你喜欢
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多