【问题标题】:Kotlin - Continue Coroutine after ExceptionKotlin - 异常后继续协程
【发布时间】:2017-01-11 01:59:46
【问题描述】:

我的问题

异常后是否可以继续执行协程?

示例

try {
    someMethod1()
    someMethod2() //Throws an exception!
    someMethod3()
} catch(e: Exception) {
    //I do not want to call someMethod3 here!
    //I want the coroutine to resume after the exception inside of the original block.
} finally {
    //I also do not want to call someMethod3 here!
    //I want the coroutine to resume after the exception inside of the original block.
}

我不确定这是否可能,但提前感谢您查看!

【问题讨论】:

  • 我认为它类似于 Java,即不可能。这不是 Lisp ;)
  • 这就是它的样子。该死。谢谢!
  • 我认为这是不可能的。我想这也不应该是可能的。我会争辩说,如果您可以在异常后恢复执行,那么该异常毕竟不是“异常”。

标签: exception kotlin coroutine


【解决方案1】:

简短的回答是这是不可能的。更长的答案是这样的:

Kotlin 协程让您暂停只在设计的暂停点(使用暂停函数)执行代码。协程不是一般的 goto 控制结构。恰恰相反,它是一个非常受约束和严格检查的控制流概念,可确保您不会破坏代码顺序执行的错觉,尽管您可以暂停代码的执行并稍后恢复它。

Kotlin 协程实现 one-shot continuations,一旦代码块暂停,它只能恢复一次以继续遵循常规的顺序执行逻辑,例如如果代码抛出异常,你仍然可以暂停 id,但你只能恢复它以继续做它正在做的事情(处理这个异常)。

【讨论】:

  • resumeWithException 与此无关吗?
  • 不。 resumeWithException 确实恢复异常,但您只能执行一次。您不能“再次恢复”。
【解决方案2】:

为此,someMethod1someMethod2someMethod3 必须是 suspend fun。那么你只需要在控制器中捕获异常并恢复协程即可。

【讨论】:

  • 你能给我举个例子来说明你的意思吗:“在控制器中捕获异常并恢复协程”对不起,我刚接触 Kotlin 几天。提前致谢。
  • 好吧,我从来没有尝试过自己动手。协程是非常先进的人员,你知道的。
  • 建议一个“解决方案”并说我实际上从未尝试过))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 2021-06-20
  • 2018-05-26
  • 2014-12-18
  • 2021-05-13
  • 1970-01-01
相关资源
最近更新 更多