转载请标明出处: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()
}
}

发生崩溃。

kotlin协程异常处理之-CoroutineExceptionHandler的更多相关文章

  1. Kotlin 协程一 —— 全面了解 Kotlin 协程

    一.协程的一些前置知识 1.1 进程和线程 1.1.1基本定义 1.1.2为什么要有线程 1.1.3 进程与线程的区别 1.2 协作式与抢占式 1.2.1 协作式 1.2.2 抢占式 1.3 协程 二 ...

  2. Kotlin协程解析系列(上):协程调度与挂起

    vivo 互联网客户端团队- Ruan Wen 本文是Kotlin协程解析系列文章的开篇,主要介绍Kotlin协程的创建.协程调度与协程挂起相关的内容 一.协程引入 Kotlin 中引入 Corout ...

  3. Kotlin协程第一个示例剖析及Kotlin线程使用技巧

    Kotlin协程第一个示例剖析: 上一次https://www.cnblogs.com/webor2006/p/11712521.html已经对Kotlin中的协程有了理论化的了解了,这次则用代码来直 ...

  4. Retrofit使用Kotlin协程发送请求

    Retrofit2.6开始增加了对Kotlin协程的支持,可以通过suspend函数进行异步调用.本文简单介绍一下Retrofit中协程的使用 导入依赖 app的build文件中加入: impleme ...

  5. Kotlin协程基础

    开发环境 IntelliJ IDEA 2021.2.2 (Community Edition) Kotlin: 212-1.5.10-release-IJ5284.40 我们已经通过第一个例子学会了启 ...

  6. Android Kotlin协程入门

    Android官方推荐使用协程来处理异步问题.以下是协程的特点: 轻量:单个线程上可运行多个协程.协程支持挂起,不会使正在运行协程的线程阻塞.挂起比阻塞节省内存,且支持多个并行操作. 内存泄漏更少:使 ...

  7. rxjava回调地狱-kotlin协程来帮忙

    本文探讨的是在tomcat服务端接口编程中, 异步servlet场景下( 参考我另外一个文章),用rxjava来改造接口为全流程异步方式 好处不用说 tomcat的worker线程利用率大幅提高,接口 ...

  8. Kotlin协程通信机制: Channel

    Coroutines Channels Java中的多线程通信, 总会涉及到共享状态(shared mutable state)的读写, 有同步, 死锁等问题要处理. 协程中的Channel用于协程间 ...

  9. Kotlin协程作用域与Job详解

    Job详解: 在上一次https://www.cnblogs.com/webor2006/p/11725866.html中抛出了一个问题: 所以咱们将delay去掉,需要改造一下,先把主线程的dela ...

  10. Kotlin协程作用域与构建器详解

    在上次我们是通过了这种方式来创建了一个协程: 接着再来看另一种创建协程的方式: 下面用它来实现上一次程序一样的效果,先来回顾一下上一次程序的代码: 好,下面改用runBlocking的方式: 运行一下 ...

随机推荐

  1. 什么是根号?什么是 log ?

    生日悖论是 \(O(\sqrt{n})\) 随机序列 LIS 是 \(O(\sqrt{n})\) 随机 \(\pm1\) 序列前缀和最大绝对值是 \(O(\sqrt{n})\) 证明 随机 Prufe ...

  2. MySQL新增数据,修改数据,删除数据

    连接本地mysql语句 mysql -hlocalhost -uroot -proot DML-介绍 DML英文全称是:用来对数据库中表的数据记录进行 增 删 改 操作. 增加使用 insert 删除 ...

  3. 【NSSCTF-Round#16】 Web和Crypto详细完整WP

    每天都要加油哦!    ------2024-01-18  11:16:55 [NSSRound#16 Basic]RCE但是没有完全RCE <?php error_reporting(0); ...

  4. windows加壳程序WinLicense与Themida

    反调试提示 开了Procmon.exe之后启动游戏会弹出这个框,这个是程序加壳之后的反外挂,反调试提示框. WinLicense A monitor program has been found ru ...

  5. 爱了爱了!推荐一个Github 70k+点赞的Java学习指南!

    大家好,我是 Guide 哥!今天给大家推荐一个非常不错的 Java 教程类开源项目-JavaGuide ,Github 地址: https://github.com/Snailclimb/JavaG ...

  6. Prompt工程师指南[高阶篇]:对抗性Prompting、主动prompt、ReAct、GraphPrompts、Multimodal CoT Prompting等

    Prompt工程师指南[高阶篇]:对抗性Prompting.主动prompt.ReAct.GraphPrompts.Multimodal CoT Prompting等 1.对抗性 Prompting ...

  7. 多智能体强化学习算法【二】【MADDPG、QMIX、MAPPO】

    相关文章: 常见多智能体强化学习仿真环境介绍[一]{推荐收藏,真的牛} 多智能体强化学习算法[一][MAPPO.MADDPG.QMIX] 多智能体强化学习算法[二][MADDPG.QMIX.MAPPO ...

  8. .NET NativeAOT 指南

    .NET NativeAOT 指南 随着 .NET 8 的发布,一种新的"时尚"应用模型 NativeAOT 开始在各种真实世界的应用中广泛使用. 除了对 NativeAOT 工具 ...

  9. 神经网络优化篇:详解测试时的 Batch Norm(Batch Norm at test time)

    Batch归一化将的数据以mini-batch的形式逐一处理,但在测试时,可能需要对每个样本逐一处理,来看一下怎样调整的网络来做到这一点. 回想一下,在训练时,这些就是用来执行Batch归一化的等式. ...

  10. 洛谷P1009 阶乘之和

    捏妈第三节的题单名不是循环结构吗,直接出了第八节的高精度大数计算,紧急学习 对于较大数的加减乘除阶乘等,C/C++原生的数据类型是存储不了的(即便用longlong),直接计算会出现数据移除成负数的结 ...