首页 > 其他分享 >kotlin协程异常处理之-CoroutineExceptionHandler

kotlin协程异常处理之-CoroutineExceptionHandler

时间:2023-08-21 17:23:02浏览次数:44  
标签:协程 Log launch kotlin MainActivity throwable CoroutineExceptionHandler

转载请标明出处:https://www.cnblogs.com/tangZH/p/17307406.html

CoroutineExceptionHandler用于在协程中捕获异常。

一、CoroutineExceptionHandler只能处理当前域内开启的子协程或者当前协程抛出的异常

GlobalScope.launch(CoroutineExceptionHandler { _, throwable ->
    Log.d("MainActivity_", throwable.message.toString())
}) {
    launch {
        Log.d("MainActivity_", "launch-> threadName->" + Thread.currentThread().name)
        throw NullPointerException()
    }
}

不会发生崩溃。


GlobalScope.launch(CoroutineExceptionHandler { _, throwable ->
    Log.d("MainActivity_", throwable.message.toString())
}) {
    GlobalScope.launch {
        Log.d("MainActivity_", "launch-> threadName->" + Thread.currentThread().name)
        throw NullPointerException()
    }
}

而这个例子便发生崩溃了。

二、CoroutineExceptionHandler 仅在未捕获的异常上调用,也即这个异常没有任何方式处理时(比如在源头tryCatch了)

GlobalScope.launch(CoroutineExceptionHandler { _, throwable ->
    Log.d("MainActivity_", throwable.message.toString())
}) {
    launch {
        try {
            Log.d("MainActivity_", "launch-> threadName->" + Thread.currentThread().name)
            throw NullPointerException()
        } catch (e: Exception) {
            Log.d("MainActivity_", "catch->" + e.message)
            e.printStackTrace()
        }
    }
}

输出:

D/MainActivity_: launch-> threadName->DefaultDispatcher-worker-2
D/MainActivity_: catch->null

可以看出发生异常的时候被捕获了,CoroutineExceptionHandler里面的回调方法不会执行。

三、当子协程发生异常时,它会优先将异常委托给父协程区处理,以此类推 直到根协程作用域或者顶级协程 。因此其永远不会使用我们子协程 CoroutineContext 传递的 CoroutineExceptionHandler(SupervisorJob 除外)。

val scope = CoroutineScope(Job())
scope.launch {
    launch(CoroutineExceptionHandler { _, _ -> }) {
        delay(10)
        throw RuntimeException()
    }
}

发生崩溃。

标签:协程,Log,launch,kotlin,MainActivity,throwable,CoroutineExceptionHandler
From: https://www.cnblogs.com/tangZH/p/17307406.html

相关文章

  • Kotlin-大师班 第三章-随笔
    1.Kotlin中,不管是用val或是var声明的变量,都是不可为空的。想让变量可空,需要在声明语句的类型后面加个问号。 2.elvis运算符?:  当你要把一个nullable变量赋值给一个不可空变量时,使用该运算符。否则被赋值变量会被定义为可空变量。 3.doubleexclamation......
  • 为什么 Java 坚持多线程不选择协程?
    1.引言在编程的世界里,多线程和协程是两种主要的并发处理方法。Java,作为一种广泛使用的编程语言,从其早期版本开始就深入支持多线程。那么,为什么Java坚持使用多线程而不是协程?要理解这个问题,我们需要深入探讨两者之间的差异以及Java的设计哲学。2.多线程和协程的基本差异多线程:线程......
  • Kotlin-大师班 第二章-随笔
    1.AppCompatActicity.onCreate()每次Activity创建时调用。Activity对应一个屏幕,如果你的应用程序中有多个屏幕,如登录屏幕、客人资料等,所有这些都是不同的Activity。 可以理解为Activity对等于屏幕。2. setContentView设置View的内容。R代表Resources3.sp:......
  • 协程
    #include"co.h"#include"list.h"#include<stdint.h>#include<stdlib.h>#include<setjmp.h>#include<assert.h>/*#definedbg(...)printf(__VA_ARGS__)*/#definedbg(...)enumco_status{CO_NEW=1,//新......
  • 安卓kotlin的继续
    https://developer.android.google.cn/jetpack/compose/tutorial?hl=zh-cn#animate-messages-while-expandinghttps://gitee.com/createmaker/my_android_empty_compose_act1这几天请假办理个人事情,真想赶紧能找个合适的合伙人一起创业!......
  • 协程上下文的设计与使用
    协程上下文的设计与使用协程是一种轻量级的并发编程模式,它可以让我们用同步的方式写出异步的代码,提高代码的可读性和性能。在协程框架中,有一个非常重要的概念,就是协程上下文(CoroutineContext)。协程上下文可以看作是一组协程运行所需的环境变量,比如调度器、异常处理器、协程名等。在......
  • 《高级程序员 面试攻略 》通俗拟人解释 swoole的协程 和 go的协程有什么区别
    Swoole的协程和Go的协程(Goroutine)都是用于实现轻量级并发的机制,但它们有一些区别。1.语言和环境:Swoole协程是在PHP语言中实现的,而Go协程是在Go语言中实现的。因此,它们在语言和运行时环境上存在差异。1.编程模型:Swoole协程使用的是“同步风格”的编程模型,类似于传统......
  • Boost Asio协程实现服务器
    参考:https://llfc.club/category?catid=225RaiVNI8pFDD5L4m807g7ZwmF#!aid/2RHA2vfllSmYXf4xcJqzzVtLrJt简介之前介绍了asio服务器并发编程的几种模型,包括单线程,多线程IOServicePool,多线程IOThreadPool等,今天带着大家利用asio协程实现并发服务器。利用协程实现并发程序有两个好......
  • Kotlin: 什么是协程(coroutine)?
    在Kotlin中,协程(Coroutine)是一个轻量级的线程管理工具,它可以用更简单、更可读的方式来处理并发和异步任务。协程使得编写异步代码的方式几乎与同步代码一样简单。1.基础概念协程与线程的差异:线程是操作系统级别的,其调度由操作系统管理。相反,协程是应用级别的,其调度由程序或库管理。......
  • golang之协程+chan通道
     [管道]分为有缓冲和无缓冲两种无缓冲: 1)接受者与发送者必然存在于两个协程,否则会造成互相等待死锁的情况顺序执行多协程:varch1=make(chanint)varstopFlag=make(chanbool)//保证两个协程顺序执行gofunc(){fmt.Println("g1")......