美文网首页
4.协程的异常处理(1)

4.协程的异常处理(1)

作者: 学吉他的袁先生 | 来源:发表于2020-08-07 17:10 被阅读0次

1.讲解异常之前先写这样一个例子
需求异步操作获取用户,主界面展示用户信息,怎么样用协程的方式去写

typealias CallBack=(User)->Unit
fun getUser(callback: CallBack){
    thread {
        log(1)
        var user=User("he",23)
        callback.invoke(user)
    }
}
suspend fun getUserCoroutine()= suspendCoroutine<User> {
    continuation->
    getUser {
        continuation.resume(it)
    }
}
suspend fun main(){
    GlobalScope.launch (Dispatchers.Main){
        val name = getUserCoroutine().name
        val age = getUserCoroutine().age
        log(name+age)
    }.join()
}

思考如果获取user的过程中有异常出现怎么处理,比如name为空字符串的user视为异常

interface MyCallBack<T>{
    fun onSuccess(value:T)
    fun onError(t:Throwable)
}
fun getUserWithError(callback: MyCallBack<User>){
    //模拟异步操作
    thread {
        log(1)
        var user=User("",23)
        if (user.name.isEmpty()){
            callback.onError(Throwable("姓名为空"))
        }else{
            callback.onSuccess(user)
        }

    }
}
suspend fun getUserCoroutineWithError()= suspendCoroutine<User> {
    continuation->
    getUserWithError(object :MyCallBack<User>{
        override fun onSuccess(value: User) {
            continuation.resume(value)
        }

        override fun onError(t: Throwable) {
            continuation.resumeWithException(t)
        }

    })
}
suspend fun main(){
    GlobalScope.launch {
        try {
            val user = getUserCoroutineWithError()
            log(user.name)
        }catch (t:Throwable){
            log(t)
        }
    }.join()
}

从上面的代码我们可以看出一个异步的请求异常,我们只需要在协程里面try,catch就可以了
这个时候我们再去看开篇协程实现retrofit请求,就理解为什么可以这样子写

GlobalScope.launch {
    try {
        val weatherEntity = apiService.getMessage3("郑州")
        println(weatherEntity.temperature)
    }catch (e:Throwable){
        println(e.message)
    }
}

还有一种异常捕获方式,不需要写try,catch

suspend fun main(){
    val coroutineExceptionHandler = CoroutineExceptionHandler { coroutineContext, throwable ->
        log(throwable)
    }
    GlobalScope.launch(coroutineExceptionHandler) {
        val user = getUserCoroutineWithError()
        log(user.name)
    }.join()
}

CoroutineExceptionHandler 同样也是协程上下文,但是不适用于async启动的协程

相关文章

  • 4.协程的异常处理(1)

    1.讲解异常之前先写这样一个例子需求异步操作获取用户,主界面展示用户信息,怎么样用协程的方式去写 思考如果获取us...

  • Android中对Kotlin Coroutines(协程)的理

    (接第一部分) 异常处理1.协程的异常传递协程的异常传播也是遵循了协程上下文的机制,除了取消异常(Cancella...

  • 4.协程的异常处理(2)

    异常的传播异常传播是指异常在父子协程中的传播,什么是父子协程,在当前协程中又启动一个协程,那么这个新启动的协程就是...

  • 破解 Kotlin 协程(4) - 异常处理篇

    关键词:Kotlin 协程 异常处理 异步代码的异常处理通常都比较让人头疼,而协程则再一次展现了它的威力。 1. ...

  • Kotlin协程

    协程基础概念[https://zhuanlan.zhihu.com/p/427092689]协程异常处理[http...

  • Android版kotlin协程入门(三):kotlin协程的异

    kotlin协程的异常处理 在上一篇《Android kotlin协程入门(二):kotlin协程的关键知识点初步...

  • Python协程

    目录:一、基于生成器的协程二、协程状态三、协程预激装饰器四、终止协程和异常处理五、协程返回值六、yield fro...

  • 协程中的取消和异常 (核心概念介绍)

    当我们需要避免多余的协程处理任务减少内存浪费,节约电量,协程的取消操作尤为重要。而协程的异常处理对于用户体验来说也...

  • 协程的异常处理

    CoroutineExceptionHandler 被用来将通用的 catch代码块在协程中自定义日志记录或异常处...

  • 协程的异常处理

    什么情况下 try-catch 会失效? 在 try-catch 块中创建了一个子协程,调用了一个百分百会失败的接...

网友评论

      本文标题:4.协程的异常处理(1)

      本文链接:https://www.haomeiwen.com/subject/adqtdktx.html