如果发生异常是否取消流程
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>
,它将不允许您发出异常。
我正在对 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>
,它将不允许您发出异常。