协程是互相协作的程序,协程是结构化的。如果把Java的异常处理机制,照搬到Kotlin协程中,一定会遇到很多的坑。Kotlin协程中的异常主要分两大类,协程取消异常(CancellationException)其他异常
单个异常捕捉
val handler = CoroutineExceptionHandler { coroutineContext, throwable ->
Log.d(TAG, "onCreate: handler${throwable}")
}
Log.d(TAG, "onCreate:1")
findViewById<Button>(R.id.button).also {
it.setOnClickListener {
GlobalScope.launch(handler) {
Log.d(TAG, "onCreate: onClick")
"anc".substring(10)
}
}
}launch里面如果不写handler
可以使用这样的方式来创建全局异常捕获处理
在main目录下
新建 resources\META-INF\services\kotlinx.coroutines.CoroutineExceptionHandler

注意没有后缀哦
然后回到java类里面 随便找个位置创建class类

内容
package com.example.coroutine
import android.util.Log
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlin.coroutines.CoroutineContext
class GlobalCoroutineExceptionHandler : CoroutineExceptionHandler {
override val key = CoroutineExceptionHandler
private val TAG = "GlobalCortineExceptionH"
override fun handleException(context: CoroutineContext, exception: Throwable) {
Log.d(TAG, "handleException:${exception} ")
}
}根据包名和类目
package com.example.coroutine.GlobalCoroutineExceptionHandler
我们可以确定这个文件的路径为
com.example.coroutine.GlobalCoroutineExceptionHandler
写到刚才创建的没有后缀的文件当中去

程序里删除 hander
findViewById<Button>(R.id.button).also {
it.setOnClickListener {
GlobalScope.launch {
Log.d(TAG, "onCreate: onClick")
"anc".substring(10)
}
}
}点击按钮后程序会闪退
但是

异常可以拿到。这就很好了
到此这篇关于Kotlin全局捕捉协程异常方法详解的文章就介绍到这了,更多相关Kotlin协程异常内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:Kotlin全局捕捉协程异常方法详解
基础教程推荐
- iOS开发教程之XLForm的基本使用方法 2023-05-01
- Android开发使用RecyclerView添加点击事件实例详解 2023-06-15
- Flutter手势密码的实现示例(附demo) 2023-04-11
- android studio按钮监听的5种方法实例详解 2023-01-12
- 解决Android Studio突然不显示logcat日志的问题 2023-02-04
- IOS 播放系统提示音使用总结(AudioToolbox) 2023-03-01
- Android多返回栈技术 2023-04-15
- IOS应用内跳转系统设置相关界面的方法 2022-11-20
- Android中的webview监听每次URL变化实例 2023-01-23
- Flutter绘图组件之CustomPaint使用详解 2023-05-12
