kotlin CoroutineScope.什么时候可以启动throw?

cgyqldqp  于 2023-10-23  发布在  Kotlin
关注(0)|答案(1)|浏览(94)

我有一个场景,当收到请求时,应该立即响应请求被确认,但没有处理。处理是异步执行的,它可能会抛出一些异常。
在这种情况下,这些try-catch块是否过于夸张?

fun handleRequest(request: Request): String {
  try {
    GlobalScope.launch { 
      try {
        process(request) 
      } catch (e: Exception) { 
        notifyAboutProcessingFailureAsync(request, e) // sends a response, another, separate request back to caller, with information about failure
      }
    }
    "processing"
  } catch(e: Exception) {
    notifyAboutProcessingFailureAsync(request, e)
    "failure"
  }
}

这似乎也是错误的,例如,这段代码通知两次失败-一次是在创建同步响应"failure"时,第二次是在notifyAboutProcessingFailureAsync完成其工作时。
是否有一个(合理的)场景,CoroutineScope.launch实际上抛出?所以代码可以简化为

fun handleRequest(request: Request): String {
  GlobalScope.launch {
    try {
      process(request)
    } catch (e: Exception) { 
      notifyAboutProcessingFailureAsync(request, e)
    }
  }
  "processing"
}
wfveoks0

wfveoks01#

launch是异步的,从不抛出。你写的第一个函数总是返回"processing",永远不会到达外部catch块。如果您还消除了协程中的catch,它仍然不会抛出,因为它是异步的。
(When一个launch协程有一个未捕获的异常,默认行为是取消其父作业,但是如果启动它的作用域使用的是SupervisorJob,那也不会发生。
你的第二个功能更合理。(忽略我假设存在的反模式,因为这只是一个快速示例。)

相关问题