如果发生异常是否取消流程

Is a flow cancelled if an exception happens

我正在对 kotlin 中的流程进行一些试验,并问自己一个问题:即使我使用 .catch,如果流程中的其中一个操作抛出异常,我的流程是否会被取消?

如果没有,即使在使用 .catch 时发生异常,我该如何取消流程?

例子

fun testFlow() = flow {
   emit("Test")
   emit(Exception("Error"))
   emit("Test2") // This should not be emitted
}.catch { e -> println("Showing UI $e") }

另一个例子

fun testFlow2() = flow {
   emit("Test")
   throw Exception("Error")
   emit("Test2") // This should not be emitted
}.catch { e -> println("Showing UI $e") }

如果 Flow 的执行 抛出 异常,它将在收集期间取消并完成 Flow。如果未使用 Flow.catch 运算符,collect() 函数调用将抛出异常。

如果您发出 异常,就像您的示例中那样,它只是流中的另一个对象。由于您没有指定 Flow 的类型,它隐式地选择了 String 和 Exception 之间通用的类型。我认为你有一个 Flow<Serializable> 因为这是两者的共同超类型。如果您指定了 Flow<String>,它将不允许您发出异常。