前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Kotlin 协程】Flow 流异常处理 ( 收集元素异常处理 | 使用 try...catch 代码块捕获处理异常 | 发射元素时异常处理 | 使用 Flow#catch 函数捕获处理异常 )

【Kotlin 协程】Flow 流异常处理 ( 收集元素异常处理 | 使用 try...catch 代码块捕获处理异常 | 发射元素时异常处理 | 使用 Flow#catch 函数捕获处理异常 )

作者头像
韩曙亮
发布2023-03-30 18:31:46
1.8K0
发布2023-03-30 18:31:46
举报

文章目录

一、Flow 流异常处理


在 Flow 流 的

  • 构建器代码 : flow , flowOf , asFlow ;
  • 发射元素 : emit 发射元素 ;
  • 收集元素 : collect 收集元素 ;
  • 各种运算符代码 : 过渡操作符 , 限长操作符 , 末端操作符 等 ;

中 , 如果运行时 , 抛出异常 , 可以使用

  • try{}catch(e: Exception){} 代码块 收集元素时捕获异常
  • Flow#catch 函数 发射元素时捕获异常

处理异常 ;

二、收集元素异常处理


1、收集元素异常代码示例

异常代码示例 : 如果收集的元素 it <= 1 , 则检查通过 , 否则当 it > 1 时 会报异常 ;

代码语言:javascript
复制
package kim.hsl.coroutine

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        runBlocking {
            flowEmit().collect {
                println("收集元素 $it")
                check(it <= 1) {
                    "抛出异常 $it <= 1"
                }
            }
        }
    }

    suspend fun flowEmit() = flow<Int> {
        // 以 100 ms 的间隔发射元素
        for (i in 0..5) {
            emit(i)
            println("发射元素 $i")
        }
    }
}

执行结果 :it > 1 时 会报异常 Caused by: java.lang.IllegalStateException: 抛出异常 2 <= 1 ;

代码语言:javascript
复制
21:51:03.014 System.out   kim.hsl.coroutine     I  收集元素 0
21:51:03.015 System.out   kim.hsl.coroutine     I  发射元素 0
21:51:03.015 System.out   kim.hsl.coroutine     I  收集元素 1
21:51:03.015 System.out   kim.hsl.coroutine     I  发射元素 1
21:51:03.015 System.out   kim.hsl.coroutine     I  收集元素 2
--------- beginning of crash
21:51:03.021 Andro...time kim.hsl.coroutine     D  Shutting down VM
21:51:03.030 Andro...time kim.hsl.coroutine     E  FATAL EXCEPTION: main
                                                   Process: kim.hsl.coroutine, PID: 6476
                                                   java.lang.RuntimeException: Unable to start activity ComponentInfo{kim.hsl.coroutine/kim.hsl.coroutine.MainActivity}: java.lang.IllegalStateException: 抛出异常 2 <= 1
                                                   	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2951)
                                                   	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)
                                                   	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
                                                   	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
                                                   	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
                                                   	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
                                                   	at android.os.Handler.dispatchMessage(Handler.java:106)
                                                   	at android.os.Looper.loop(Looper.java:193)
                                                   	at android.app.ActivityThread.main(ActivityThread.java:6718)
                                                   	at java.lang.reflect.Method.invoke(Native Method)
                                                   	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
                                                   	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
                                                   Caused by: java.lang.IllegalStateException: 抛出异常 2 <= 1
                                                   	at kim.hsl.coroutine.MainActivity$onCreate$1$invokeSuspend$$inlined$collect$1.emit(Collect.kt:134)
                                                   	at kotlinx.coroutines.flow.internal.SafeCollectorKt$emitFun$1.invoke(SafeCollector.kt:15)
                                                   	at kotlinx.coroutines.flow.internal.SafeCollectorKt$emitFun$1.invoke(SafeCollector.kt:15)
                                                   	at kotlinx.coroutines.flow.internal.SafeCollector.emit(SafeCollector.kt:77)
                                                   	at kotlinx.coroutines.flow.internal.SafeCollector.emit(SafeCollector.kt:59)
                                                   	at kim.hsl.coroutine.MainActivity$flowEmit$2.invokeSuspend(MainActivity.kt:27)
                                                   	at kim.hsl.coroutine.MainActivity$flowEmit$2.invoke(Unknown Source:8)
                                                   	at kim.hsl.coroutine.MainActivity$flowEmit$2.invoke(Unknown Source:4)
                                                   	at kotlinx.coroutines.flow.SafeFlow.collectSafely(Builders.kt:61)
                                                   	at kotlinx.coroutines.flow.AbstractFlow.collect(Flow.kt:212)
                                                   	at kim.hsl.coroutine.MainActivity$onCreate$1.invokeSuspend(MainActivity.kt:32)
                                                   	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
                                                   	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
                                                   	at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:277)
                                                   	at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:87)
                                                   	at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:61)
                                                   	at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source:1)
                                                   	at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:40)
                                                   	at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source:1)
                                                   	at kim.hsl.coroutine.MainActivity.onCreate(MainActivity.kt:14)
                                                   	at android.app.Activity.performCreate(Activity.java:7144)
                                                   	at android.app.Activity.performCreate(Activity.java:7135)
                                                   	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
                                                   	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2931)
                                                   	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086) 
                                                   	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
                                                   	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
                                                   	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
                                                   	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816) 
                                                   	at android.os.Handler.dispatchMessage(Handler.java:106) 
                                                   	at android.os.Looper.loop(Looper.java:193) 
                                                   	at android.app.ActivityThread.main(ActivityThread.java:6718) 
                                                   	at java.lang.reflect.Method.invoke(Native Method) 
                                                   	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
                                                   	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
21:51:03.066 Process      kim.hsl.coroutine     I  Sending signal. PID: 6476 SIG: 9
---------------------------- PROCESS ENDED (6476) for package kim.hsl.coroutine ----------------------------
在这里插入图片描述
在这里插入图片描述

2、收集元素捕获异常代码示例

代码示例 : 在 收集元素 时 , 使用 try…catch 代码块捕获异常 ;

代码语言:javascript
复制
package kim.hsl.coroutine

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        runBlocking {
            try {
                flowEmit().collect {
                    println("收集元素 $it")
                    check(it <= 1) {
                        "抛出异常 $it <= 1"
                    }
                }
            } catch (e: Exception) {
                println("捕获到了异常 ${e.message}")
            }
        }
    }

    suspend fun flowEmit() = flow<Int> {
        // 以 100 ms 的间隔发射元素
        for (i in 0..5) {
            emit(i)
            println("发射元素 $i")
        }
    }
}

执行结果 :

代码语言:javascript
复制
21:57:22.932 System.out   kim.hsl.coroutine     I  收集元素 0
21:57:22.932 System.out   kim.hsl.coroutine     I  发射元素 0
21:57:22.933 System.out   kim.hsl.coroutine     I  收集元素 1
21:57:22.933 System.out   kim.hsl.coroutine     I  发射元素 1
21:57:22.933 System.out   kim.hsl.coroutine     I  收集元素 2
21:57:22.934 System.out   kim.hsl.coroutine     I  捕获到了异常 抛出异常 2 <= 1
在这里插入图片描述
在这里插入图片描述

三、发射元素异常处理


1、发射元素异常代码示例

代码示例 :

代码语言:javascript
复制
package kim.hsl.coroutine

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.runBlocking
import java.io.IOException

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        runBlocking {
            flowEmit().collect {
                println("收集元素 $it")
            }
        }
    }

    suspend fun flowEmit() = flow<Int> {
        emit(0)
        throw IOException("IO 异常")
    }.flowOn(Dispatchers.IO)
}

执行结果 :

代码语言:javascript
复制
22:19:59.361 System.out   kim.hsl.coroutine     I  收集元素 0
22:19:59.368 Andro...time kim.hsl.coroutine     D  Shutting down VM
22:19:59.374 Andro...time kim.hsl.coroutine     E  FATAL EXCEPTION: main
                                                   Process: kim.hsl.coroutine, PID: 11490
                                                   java.lang.RuntimeException: Unable to start activity ComponentInfo{kim.hsl.coroutine/kim.hsl.coroutine.MainActivity}: java.io.IOException: IO 异常
                                                   	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2951)
                                                   	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)
                                                   	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
                                                   	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
                                                   	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
                                                   	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
                                                   	at android.os.Handler.dispatchMessage(Handler.java:106)
                                                   	at android.os.Looper.loop(Looper.java:193)
                                                   	at android.app.ActivityThread.main(ActivityThread.java:6718)
                                                   	at java.lang.reflect.Method.invoke(Native Method)
                                                   	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
                                                   	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
                                                   Caused by: java.io.IOException: IO 异常
                                                   	at kim.hsl.coroutine.MainActivity$flowEmit$2.invokeSuspend(MainActivity.kt:26)
                                                   	at kim.hsl.coroutine.MainActivity$flowEmit$2.invoke(Unknown Source:8)
                                                   	at kim.hsl.coroutine.MainActivity$flowEmit$2.invoke(Unknown Source:4)
                                                   	at kotlinx.coroutines.flow.SafeFlow.collectSafely(Builders.kt:61)
                                                   	at kotlinx.coroutines.flow.AbstractFlow.collect(Flow.kt:212)
                                                   	at kotlinx.coroutines.flow.internal.ChannelFlowOperatorImpl.flowCollect(ChannelFlow.kt:195)
                                                   	at kotlinx.coroutines.flow.internal.ChannelFlowOperator.collectTo$suspendImpl(ChannelFlow.kt:157)
                                                   	at kotlinx.coroutines.flow.internal.ChannelFlowOperator.collectTo(Unknown Source:0)
                                                   	at kotlinx.coroutines.flow.internal.ChannelFlow$collectToFun$1.invokeSuspend(ChannelFlow.kt:60)
                                                   	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
                                                   	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
                                                   	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
                                                   	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
                                                   	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
                                                   	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
22:19:59.392 Process      kim.hsl.coroutine     I  Sending signal. PID: 11490 SIG: 9
在这里插入图片描述
在这里插入图片描述

2、发射元素异常捕获代码示例

代码示例 :

代码语言:javascript
复制
package kim.hsl.coroutine

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.runBlocking
import java.io.IOException

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        runBlocking {
            flowEmit().collect {
                println("收集元素 $it")
            }
        }
    }

    suspend fun flowEmit() = flow<Int> {
        emit(0)
        throw IOException("IO 异常")
    }.catch {
        t: Throwable ->
        println("捕获异常 : ${t.message}")
    }.flowOn(Dispatchers.IO)
}

执行结果 :

代码语言:javascript
复制
22:22:59.523 System.out   kim.hsl.coroutine     I  收集元素 0
22:22:59.529 System.out   kim.hsl.coroutine     I  捕获异常 : IO 异常
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、Flow 流异常处理
  • 二、收集元素异常处理
    • 1、收集元素异常代码示例
      • 2、收集元素捕获异常代码示例
      • 三、发射元素异常处理
        • 1、发射元素异常代码示例
          • 2、发射元素异常捕获代码示例
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档