Kotlin - 异常后继续协程执行

4

我的问题

在协程抛出异常后是否可能继续执行?

示例

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 ;) - Jan Slominski
看起来是这样。糟糕。谢谢! - Wonderlus
我认为这是不可能的。我猜这也不应该是可能的。我会主张,如果你能够在异常后恢复执行,那么这个异常本来就不是“异常”的了。 - marstran
2个回答

3
简短的回答是不可能的。更长的答案是这样的:
Kotlin协程只允许您在设计好的挂起点(使用挂起函数)暂停代码的执行。协程不是一般类似于goto的控制结构。相反,它是一个非常严格约束和严密检查的控制流概念,确保您不会破坏代码顺序执行的幻觉,尽管您可以暂停代码的执行并稍后恢复它。
Kotlin协程实现了“一次性连续体”(one-shot continuations),一旦代码块被挂起,它只能被恢复一次以继续按其正常的顺序执行逻辑,例如,如果代码引发异常,则仍然可以中止它,但只能恢复它来继续处理此异常。

resumeWithException 和这个没有关联吗? - jeiea
不行。resumeWithException确实会带着异常继续执行,但你只能这样做一次。你不能“再次恢复它”。 - Roman Elizarov

-2

对于那个someMethod1someMethod2someMethod3必须是suspend fun。然后你只需要在控制器中捕获异常并恢复协程即可。


请问你能给我一个例子说明以下这句话的意思吗: "在控制器中捕获异常并恢复协程"抱歉,我才学Kotlin几天。谢谢。 - Wonderlus
嗯,我从未尝试过自己实际操作。协程是非常高级的东西,你知道的。 - voddan
提出了一个“解决方案”并说实际上我从未尝试过)) - Farid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接