首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Kotlin 协程】协程异常处理 ③ ( 协程异常处理器 CoroutineExceptionHandler 捕获异常 | 验证 CoroutineScope 协程的异常捕捉示例 )

协程的异常捕捉示例 一、协程异常处理器 CoroutineExceptionHandler 捕获异常 ---- 在 【Kotlin 协程】协程上下文 ( 协程上下文构成要素 | 指定协程上下文元素组合...CoroutineExceptionHandler , 用于 在协程中捕获异常 ; 异常捕获 : 在协程中 , 使用 CoroutineExceptionHandler 对协程运行过程中产生的 异常...进行捕获 , 异常满足如下两个条件才会被捕 : 异常捕获时机 : 协程 自动抛出 的异常 , 可以在协程内被捕获 ; 使用 launch 构建的协程 可以在协程中捕获异常 , 使用 async 构建的协程...在 await 处捕获异常 ; 异常捕获位置 : 在 协程作用域 CoroutineScope 或者在 根协程 中 捕获 异常 ; 1、对比 launch 和 async 创建的协程的异常捕捉示例...val job = scope.launch(coroutineExceptionHandler) 代码 , 在协程构建器中传入了 协程异常处理器 , 因此该协程异常处理器 可捕获 子协程传递给父协程的异常

1.3K20

【Kotlin 协程】协程异常处理 ② ( SupervisorJob 协程 | supervisorScope 协程作用域构建器函数 )

文章目录 一、SupervisorJob 协程 二、supervisorScope 协程作用域构建器函数 在上一篇博客介绍了 协程异常处理 【Kotlin 协程】协程异常处理 ① ( 根协程异常处理...| 自动传播异常 | 在协程体捕获异常 | 向用户暴露异常 | 在 await 处捕获异常 | 非根协程异常处理 | 异常传播特性 ) , 其中介绍了 协程中异常的传播特性 : 协程 运行时 , 产生异常..., 会将异常 传递给 父协程 , 父协程会执行如下操作 : ① 取消子协程 : 不仅仅取消产生异常的子协程 , 该父协程下所有的子协程都会取消 ; ② 取消父协程 : 将父协程本身取消 ; ③ 向父协程的父协程传播异常...: 继续将异常传播给 父协程的父协程 ; 这样就会导致 某个子协程一旦出现异常 , 则 兄弟协程 , 父协程 , 父协程的兄弟协程 , 父协程的父协程 等等 都会被取消 , 这样牵连太大 , 因此本篇博客中引入几种异常处理机制解决上述问题...; 一、SupervisorJob 协程 ---- SupervisorJob 协程 执行时如果 该类型的 子协程 出现异常 , 不会将 异常传递给 父协程 , 因此也不会影响到 父协程 下的 其它子协程

77210
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Kotlin 协程】协程异常处理 ① ( 根协程异常处理 | 自动传播异常 | 在协程体捕获异常 | 向用户暴露异常 | 在 await 处捕获异常 | 非根协程异常处理 | 异常传播特性 )

    文章目录 一、协程异常处理 二、根协程自动传播异常 1、异常抛出点 ( 协程体抛出异常 ) 2、异常捕获点 ( 在协程体捕获异常 ) 三、根协程向用户暴露异常 1、异常抛出点 ( 在 await、...receive 处抛出异常 ) 2、异常捕获点 ( 在 await、receive 处捕获异常 ) 四、非根协程异常处理 五、异常传播特性 一、协程异常处理 ---- 在 协程任务 中 , 执行的代码出现异常...( 协程体抛出异常 ) launch 构建器 异常代码示例 : 使用 launch 构建器创建协程 , 在协程任务中抛出异常 , 查看异常的抛出点 ; package kim.hsl.coroutine...---- 协程 运行时 , 产生异常 , 会将异常 传递给 父协程 , 父协程会执行如下操作 : ① 取消子协程 : 不仅仅取消产生异常的子协程 , 该父协程下所有的子协程都会取消 ; ② 取消父协程...: 将父协程本身取消 ; ③ 向父协程的父协程传播异常 : 继续将异常传播给 父协程的父协程 ;

    78510

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

    关键词:Kotlin 协程 异常处理 异步代码的异常处理通常都比较让人头疼,而协程则再一次展现了它的威力。 1....,出现未捕获的异常会尝试传递给父协程并尝试取消父协程。...,例如我们前面提到过 suspend main 就是这种情况,对于这种情况优先考虑通过 coroutineScope 创建作用域;更进一步,大家尽量不要直接使用标准库 API,除非你对 Kotlin 的协程机制非常熟悉...异常在作用域内的传播:当协程出现异常时,会根据当前作用域触发异常传递,GlobalScope 会创建一个独立的作用域,所谓“自成一派”,而 在 coroutineScope 当中协程异常会触发父协程的取消...,可能会导致父协程的取消,因此调用 join 时尽管不会对协程本身的异常进行抛出,但如果 join 调用所在的协程被取消,那么它会抛出取消异常,这一点需要留意。

    1.3K10

    【Kotlin 协程】协程异常处理 ④ ( Android 协程中出现异常导致应用崩溃 | Android 协程中使用协程异常处理器捕获异常 | Android 全局异常处理器 )

    文章目录 一、Android 协程中出现异常导致应用崩溃 二、Android 协程中使用协程异常处理器捕获异常 三、Android 全局异常处理器 一、Android 协程中出现异常导致应用崩溃 --...------- PROCESS ENDED (26587) for package kim.hsl.coroutine ---------------------------- 二、Android 协程中使用协程异常处理器捕获异常...---- 在 Android 程序中 , 可以使用 协程异常处理器 CoroutineExceptionHandler 捕获异常 , 将其实例对象传递给 launch 协程构建器 作为参数即可 ; 该参数作为...协程上下文 的 协程异常处理器 CoroutineExceptionHandler 元素 ; 代码示例 : package kim.hsl.coroutine import android.os.Bundle...() } } } 执行结果 : 协程异常处理器 CoroutineExceptionHandler 捕获到了异常 ; 15:47:54.749 I 验证协程中抛出异常 15:

    1.6K10

    Kotlin协程上下文和异常处理

    ) 当这些构建器用于创建一个根协程时(该协程不是另一个协程的子协程),前者这类构建器异常发生时会第一时间被抛出,而后者则依赖用户来最终消费异常,例如通过调用await或receive 非根协程产生的异常总是被传播...,SupervisorJob不会传播异常给它的父级,它会让子协程自己处理异常 或者SupervisorScope中的子协程,一个失败,其他的子协程也不会受影响,但如果是协程作用域里面有异常失败,则所有子协程都会失败退出...取消与异常紧密相关,协程内部使用CancellationException来取消异常,但这个异常会被忽略 当子协程被取消时,不会取消它的父协程 如果一个协程遇到了CancellationException...以外的异常,它将使用该异常取消它的父协程。...当协程的多个子协程因为异常而失败时,一般情况下取第一个异常进行处理。

    8810

    kotlin--协程上下文、异常处理

    ,也不会影响协程上下文继承关系,主协程还是会等待子协程执行完毕后才结束生命 如果你已经完全理解了,那么就可以知道以上例子使用async启动也是一样的效果 二、协程的异常传递 1.协程的异常传播也是遵循了协程上下文的机制...,除了取消异常(CancellationException)外,当一个协程有了异常,如果没有主动捕获异常,那么异常会向上传播,直到根协程,子协程的异常都会导致根协程退出,自然其他子协程也会退出 例子1:...3.向用户暴露异常 还记得async启动的协程返回的是一个Deferred么,它可以使用await函数,来获取协程运行结果。那么试想一下,如果我就是想要一个协程执行完返回一个异常呢?...(没有继承关系)的协程 三、协程的异常处理 1.如果想要一个协程出现异常后,不影响其继承关系中的其他协程,可以使用SupervisorJob fun `test SupervisorJob exception...,很明显这个异常是调用job3时输出的,由此又可以推断出,如果在等待任务结束时,任务出现异常并且手动捕获异常后,再启动子协程时,也会抛出异常,并且不可捕获 注意:新版本kotlin已修复这个bug,不会抛出异常了

    95510

    Kotlin协程-特殊的阻塞协程

    阻塞协程是种特殊的协程启动方式,一般是用 runBlocking{} 扩起来一段协程。...首先是父协程得到执行,然后才是子协程。 重点是这两段协程都在同一个线程main里完成。这里就带来一个有趣的问题, runBLocking{}和平时常用的launch有什么区别?...这里给出结果,改用GlobalScope.launch之后,子协程会在一个独立的线程里运行。 runBlocking 在kotlin协程官网上对于这个api的解释是桥接阻塞与非阻塞的世界。...在创建完coroutine后就进入派发流程了,这部分和Kotlin协程-一个协程的生命周期中的逻辑比较相似,下面也会讲到。...这个问说明,runBLocking{}这种协程,它的运行逻辑是先把父协程放队列里,然后取出来执行,执行完毕再把子协程入队,再出队子协程,用同样的方式递归。

    2.5K20

    Kotlin 协程总结

    协程设计的初衷是为了解决并发问题,让 「协作式多任务」 实现起来更加方便。 协程就是 Kotlin 提供的一套线程封装的 API,但并不是说协程就是为线程而生的。...不过,我们学习 Kotlin 中的协程,一开始确实可以从线程控制的角度来切入。因为在 Kotlin 中,协程的一个典型的使用场景就是线程控制。...c.suspend suspend是 Kotlin 协程最核心的关键字,几乎所有介绍 Kotlin 协程的文章和演讲都会提到它。它的中文意思是「暂停」或者「可挂起」。...所以这个 suspend,其实并不是起到把任何把协程挂起,或者说切换线程的作用。 真正挂起协程这件事,是 Kotlin 的协程框架帮我们做的。...4,Kotlin 协程 的实战 5,漫画:什么是协程? 向大佬们致敬。

    3.3K11

    Kotlin协程开篇

    《Kotlin协程》均基于Kotlinx-coroutines 1.3.70 新开个坑,专门讲kotlin的协程。聊协程之前先说一下具体聊的是协程的什么内容。 · 协程是什么? · 什么时候用协程?...· 协程的核心是什么? · kotlin的协程和其他语言的协程有什么异同? kotlin的协程的出现其实比kotlin语言还晚一点。在当前这个版本,协程甚至都还处于一个不稳定的迭代版本中。...存活 } 上面的代码是一个常规启动协程的方式,关键函数只有 launch,delay,这两个函数是kotlin协程独有的。...这个问题涉及到Kotlin协程的Scope,调度,也是协程的实现核心逻辑 Kotlin不是第一个提出协程的 实际上在Kotlin之前就有不少语言实践了协程这个概念。比如python,golang。...kotlin的协程还在发展 如果去看kotlin的协程源码的话会发现里面有很多 exeprimental 的api和实现逻辑。

    90420

    破解 Kotlin 协程(5) - 协程取消篇

    关键词:Kotlin 协程 协程取消 任务停止 协程的任务的取消需要靠协程内部调用的协作支持,这就类似于我们线程中断以及对中断状态的响应一样。 1. 线程的中断 我们先从大家熟悉的话题讲起。...再谈 Retrofit 的协程扩展 4.1 Jake Wharton 的 Adapter 存在的问题 我在破解 Kotlin 协程 - 入门篇(https://www.bennyhuo.com/2019...注意 ① 处, invokeOnCompletion 在协程进入完成状态时触发,包括异常和正常完成,那么在这时候如果发现它的状态是已经取消的,那么结果就直接调用 Call 的取消即可。...如果 cancel 抛异常而没有捕获的话,那么等同于协程体内部抛出异常,具体如何传播看所在作用域的相关定义了。...最后我们还分析了一下 Retrofit 的协程扩展的一些问题和解决方法,这个例子也进一步可以引发我们对协程作用域以及如何将现有程序协程化的思考。

    1.8K50

    【Kotlin 协程】协程异常处理 ⑤ ( 异常传播的特殊情况 | 取消子协程示例 | 子协程抛出异常后父协程处理异常时机示例 | 异常聚合 | 多个子协程抛出的异常会聚合到第一个异常中 )

    文章目录 一、异常传播的特殊情况 1、取消子协程示例 2、子协程抛出异常后父协程处理异常时机示例 二、异常聚合 ( 多个子协程抛出的异常会聚合到第一个异常中 ) 一、异常传播的特殊情况 ---- 在...【Kotlin 协程】协程异常处理 ① ( 根协程异常处理 | 自动传播异常 | 在协程体捕获异常 | 向用户暴露异常 | 在 await 处捕获异常 | 非根协程异常处理 | 异常传播特性 ) 博客中介绍到...协程 运行时 , 产生异常 , 会将异常 传递给 父协程 , 父协程会执行如下操作 : ① 取消子协程 : 不仅仅取消产生异常的子协程 , 该父协程下所有的子协程都会取消 ; ② 取消父协程 : 将父协程本身取消...异常 , 该异常是正常的操作 , 会被忽略 ; 如果 抛出 CancellationException 异常 取消 子协程 , 其 父协程 不会受其影响 ; 如果 子协程 抛出的是 其它异常 , 该异常会被传递给...父协程 进行处理 ; 如果 父协程 有多个子协程 , 多个子协程 都抛出异常 , 父协程会等到 所有子协程 都执行完毕会后 , 再处理 异常 ; 1、取消子协程示例 在下面的代码中 , 在 父协程中

    75810

    【Kotlin 协程】协程取消 ① ( 协程作用域取消 | 协程作用域子协程取消 | 通过抛出异常取消协程 | Job#cancel 函数 | 自定义异常取消协程 )

    文章目录 一、协程取消 二、协程作用域取消 三、协程作用域子协程取消 四、通过抛出异常取消协程 1、Job#cancel 函数 2、默认异常取消协程 3、自定义异常取消协程 一、协程取消 ----...协程取消 : 取消协程作用域 : 取消 协程作用域 会将该作用域中的 所有 子协程 一同取消 ; 取消子协程 : 子协程 的取消 不会影响 同一层级的 兄弟协程的执行 ; 通过抛出异常取消协程 : 协程取消通常会通过...中 启动了 job0 和 job1 两个协程 , 取消了 job1 协程 , job1 协程没有执行完毕 , job0 协程执行完毕 ; 四、通过抛出异常取消协程 ---- 1、Job#cancel..."自定义 CancellationException 异常")) 由于报出的 CancellationException 异常是正常情况 , 如果需要查看该异常 , 需要在协程中使用 try catch...(MainActivity.kt:33) 17:20:56.631 W at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith

    1.1K20

    破解 Kotlin 协程(2) - 协程启动篇

    我们今天主要说 Kotlin。...我们说过,启动协程需要三样东西,分别是 上下文、启动模式、协程体,协程体 就好比 Thread.run 当中的代码,自不必说。 本文将为大家详细介绍 启动模式。...在 Kotlin 协程当中,启动模式是一个枚举: public enum class CoroutineStart { DEFAULT, LAZY, @ExperimentalCoroutinesApi...在 Nodejs 中,Kotlin 协程的默认调度器则并没有实现线程的切换,输出结果也会略有不同,这样似乎更符合 JavaScript 的执行逻辑。 更多调度器的话题,我们后续还会进一步讨论。...我们在前面提到我们的示例都运行在 suspend main 函数当中,所以 suspend main 函数会帮我们直接启动一个协程,而我们示例的协程都是它的子协程,所以这里 5 的调度取决于这个最外层的协程的调度规则了

    1K30

    破解 Kotlin 协程(6) - 协程挂起篇

    关键词:Kotlin 协程 协程挂起 任务挂起 suspend 非阻塞 协程的挂起最初是一个很神秘的东西,因为我们总是用线程的概念去思考,所以我们只能想到阻塞。不阻塞的挂起到底是怎么回事呢?...return getSuccessfulResult(state) // ③ 正常结果立即返回 } 这段代码 ① 处就是挂起逻辑了,表示这时候目标协程还没有执行完,需要等待结果,②③是协程已经执行完可以直接拿到异常和正常结果的两种情况...协程调用完全一样。...就是 Kotlin 协程编译之后产生的字节码。...当然,这一篇内容的安排更多是为后面的序列篇开路,Kotlin 的 Sequence 就是基于协程实现的,它的用法很简单,几乎与普通的 Iterable 没什么区别,因此序列篇我们会重点关注它的内部实现原理

    1.2K30

    破解 Kotlin 协程(3) - 协程调度篇

    关键词:Kotlin 异步编程 协程 上一篇我们知道了协程启动的几种模式,也通过示例认识了 launch 启动协程的使用方法,本文将延续这些内容从调度的角度来进一步为大家揭示协程的奥义。 ? 1....注意前面对于 RxJava 和协程的实现,我们都没有考虑异常和取消的问题。有关异常和取消的话题,我们会在后面的文章中详细介绍。...Kotlin 协程设计者也特别害怕大家注意不到这一点,还特地废弃了两个 API 并且开了一个 issue 说我们要重做这套 API,这两个可怜的家伙是谁呢?...通过这个例子我们可以知道,实际上启动一个协程只需要有一个 lambda 表达式就可以了,想当年 Kotlin 1.1 刚发布的时候,我写了一系列的教程都是以标准库 API 为基础的,后来发现标准库的 API...小结 在这篇文章当中,我们介绍了协程上下文,介绍了拦截器,进而最终引出了我们的调度器,截止目前,我们还有异常处理、协程取消、Anko 对协程的支持等话题没有讲到,如果大家有协程相关想了解的话题,可以留言哈

    76920

    kotlin-协程的异常处理机制分析

    背景 使用kotlin的协程一段时间了,常用的用法也已经很熟悉,但都是停留在使用的阶段,没有对代码深入了解过,还是感觉有点虚;趁着过年这段时间,针对协程的异常处理,对其相关的源码学习了一波,梳理总结一下自己的理解...本文基于 Kotlin v1.4.0,Kotlin-Coroutines v1.3.9源码分析 1、CoroutineScope源码分析 作用:创建和追踪协程,管理不同协程之间的父子关系和结构 创建协程的方式...,不会把job取消(会打印“4”),而且异常是job2所在协程抛出来的 3、协程中异常处理的流程源码分析 3.1、协程的三层包装 第一层:launch和async返回的job,封装了协程的状态,提供取消协程的接口...小结 1、协程默认的作用域是协同作用域,异常会传播到父协程处理,即 coroutineScope或者CoroutineScope(Job())这种形式 2、协程作用域如果是主从作用域,异常不会传播到父协程处理...最后,本文异常处理分析是从协程作用域为切入点进行的,看代码过程中也会学到一些kotlin巧妙的语法使用;另外只是大概的去分析了一下异常的处理主线逻辑,有些细节的还需要去继续学习,下次会进行更加详细的分析

    95130

    【翻译】深入 Kotlin 协程

    【翻译】深入 Kotlin 协程 2017-10-26 by Liuqingwen | Tags: Kotlin 翻译 | Hits ? 一、前言 翻译好的文章也是一种学习方法!...原文作者:Adrian Bukros 二、正文 编写 Kotlin 协程相关的文章是当下比较流行的一个话题,这当然是有极好的理由支撑着的。...在 C# 5.0 中,追溯到 2012 年,关于异步函数微软提出了一个特性,非常类似 Kotlin 中的协程: public async Task doWork() { // do some...一个 OutOfMemoryException 内存溢出的异常在没有使用协程而是大量线程运行下很容易发生,这并不是什么新鲜事了。 原理是什么? 让我们看一下 async{} 函数的签名是什么样子的!...异常处理 异常处理和平常没两样。想象一下之前所描述的状态机被嵌入到一个巨大的 try/catch 代码块中!如果某个地方抛出了一个异常,它将会被捕获并传播下去,意味着你不需要做任何的改变。

    1.5K10
    领券