Kotlin全局捕捉协程异常方法详解
作者:安果移不动
协程是互相协作的程序,协程是结构化的。如果把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协程异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!