Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 是否可能捕获不同范围的异常?_Kotlin_Coroutine_Kotlin Coroutines - Fatal编程技术网

Kotlin 是否可能捕获不同范围的异常?

Kotlin 是否可能捕获不同范围的异常?,kotlin,coroutine,kotlin-coroutines,Kotlin,Coroutine,Kotlin Coroutines,这种设置可能吗 scopeA.launch { try { scopeB.launch { throw SomeException() } } catch (e: SomeException) { // Want to catch here } } 您似乎希望实现相互矛盾的事情:启动并发协同程序和暂停当前工作直到它完成,捕获可能的异常。你必须决定你真正想要什么: 如果需要并发性,请在子协同路由中处理

这种设置可能吗

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
            }
        }
    }
    
  • 如果您不想要它,请不要启动协同程序,而是使用
    与上下文(dispatcherB)

    scopeA.launch {
        try {
            withContext(dispatcherB) {
                throw SomeException()
            }
        } catch (e: SomeException) {
            // handle
        }
    }
    
  • 如果您确实想要两个具有解耦生命周期的协同路由进行通信,那么您还必须引入解耦通信机制。例如,您可以设置
    频道


  • 您似乎希望实现相互矛盾的事情:启动并发协同程序和暂停当前工作直到它完成,捕获可能的异常。你必须决定你真正想要什么:

  • 如果需要并发性,请在子协同路由中处理异常:

    scopeA.launch {
        launch(dispatcherB) {
            try {
                throw SomeException()
            } catch (e: SomeException) {
                // handle
            }
        }
    }
    
  • 如果您不想要它,请不要启动协同程序,而是使用
    与上下文(dispatcherB)

    scopeA.launch {
        try {
            withContext(dispatcherB) {
                throw SomeException()
            }
        } catch (e: SomeException) {
            // handle
        }
    }
    
  • 如果您确实想要两个具有解耦生命周期的协同路由进行通信,那么您还必须引入解耦通信机制。例如,您可以设置
    频道


  • 我认为这个答案可以帮助你们,我认为这个答案可以帮助你们,在不同的情况下,不同的作用域是有意义的吗?例如,scopeA在活动的生命周期内处于活动状态,scopeB在已建立的蓝牙连接期间处于活动状态。scopeB执行蓝牙io操作,直到断开连接(scope已取消)。scopeA和scopeB都应该使用主调度器,但有不同的生命周期。如果您在问题中包含用例,那就太好了。我试图将问题简化为给出两个作用域的要点。不过,我还是在根据你的回答重新思考我的设计。我有一个解决你问题的办法:建立一个
    频道
    ,这样你就可以向对方发出异常信号。它还可以与
    一起工作。在不同的情况下,不同的作用域是否有意义?例如,scopeA在活动的生命周期内处于活动状态,scopeB在已建立的蓝牙连接期间处于活动状态。scopeB执行蓝牙io操作,直到断开连接(scope已取消)。scopeA和scopeB都应该使用主调度器,但有不同的生命周期。如果您在问题中包含用例,那就太好了。我试图将问题简化为给出两个作用域的要点。不过,我还是在根据你的回答重新思考我的设计。我有一个解决你问题的办法:建立一个
    频道
    ,这样你就可以向对方发出异常信号。它还可以与
    一起使用。