在 Flow 流 的
中 , 如果运行时 , 抛出异常 , 可以使用
处理异常 ;
异常代码示例 : 如果收集的元素 it <= 1
, 则检查通过 , 否则当 it > 1
时 会报异常 ;
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
;
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 ----------------------------
代码示例 : 在 收集元素 时 , 使用 try…catch 代码块捕获异常 ;
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")
}
}
}
执行结果 :
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
代码示例 :
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)
}
执行结果 :
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
代码示例 :
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)
}
执行结果 :
22:22:59.523 System.out kim.hsl.coroutine I 收集元素 0
22:22:59.529 System.out kim.hsl.coroutine I 捕获异常 : IO 异常