我有一个场景,当收到请求时,应该立即响应请求被确认,但没有处理。处理是异步执行的,它可能会抛出一些异常。
在这种情况下,这些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"
}
1条答案
按热度按时间wfveoks01#
launch
是异步的,从不抛出。你写的第一个函数总是返回"processing"
,永远不会到达外部catch块。如果您还消除了协程中的catch
,它仍然不会抛出,因为它是异步的。(When一个
launch
协程有一个未捕获的异常,默认行为是取消其父作业,但是如果启动它的作用域使用的是SupervisorJob,那也不会发生。你的第二个功能更合理。(忽略我假设存在的反模式,因为这只是一个快速示例。)