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

Kotlin协程燕子异常

是指在使用Kotlin协程时可能出现的一种特殊异常情况。燕子异常(Swallowing Exception)是指在协程中发生了异常,但该异常没有被正确处理或捕获,从而导致异常被“吞噬”而不被及时发现和处理。

燕子异常可能会导致程序在运行过程中出现未知的错误,因为异常没有被及时处理,导致错误的传播和积累。这种情况下,程序可能会继续执行下去,但结果可能是不可预测的,可能会导致数据不一致或程序崩溃。

为了避免燕子异常的发生,我们可以采取以下几种措施:

  1. 使用try-catch语句捕获异常:在协程中使用try-catch语句捕获异常,并进行相应的处理,例如记录日志、回滚操作等。这样可以及时发现异常并进行处理,避免异常被吞噬。
  2. 使用CoroutineExceptionHandler处理异常:Kotlin协程提供了CoroutineExceptionHandler接口,可以用于统一处理协程中的异常。通过实现该接口,并将其设置为协程的异常处理器,可以在协程发生异常时进行统一的处理。
  3. 使用supervisorScope创建独立的作用域:通过使用supervisorScope函数创建独立的作用域,可以使得子协程的异常不会影响到父协程。这样可以避免异常的传播和积累,提高程序的健壮性。
  4. 使用async和await结合try-catch处理异常:在使用协程进行并发操作时,可以使用async函数创建一个带有返回值的协程,并使用await函数等待其执行结果。在使用await函数时,可以使用try-catch语句捕获异常,并进行相应的处理。

总结起来,为了避免Kotlin协程燕子异常的发生,我们需要在协程中正确处理异常,可以使用try-catch语句、CoroutineExceptionHandler接口、supervisorScope函数以及async和await函数结合try-catch等方式进行异常处理。这样可以保证程序的稳定性和可靠性。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Kotlin 异常处理 ③ ( 异常处理器 CoroutineExceptionHandler 捕获异常 | 验证 CoroutineScope 异常捕捉示例 )

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

1.1K20

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

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

65410

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

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

65910

破解 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.3K10

Kotlin上下文和异常处理

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

5610

kotlin--上下文、异常处理

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

92510

Kotlin-特殊的阻塞

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

2.3K20

Kotlin 总结

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

2.7K11

Kotlin开篇

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

87320

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

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

70010

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

80620

破解 Kotlin (2) - 启动篇

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

96230

破解 Kotlin (5) - 取消篇

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

1.7K50

破解 Kotlin (6) - 挂起篇

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

1.1K30

破解 Kotlin (3) - 调度篇

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

73320

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巧妙的语法使用;另外只是大概的去分析了一下异常的处理主线逻辑,有些细节的还需要去继续学习,下次会进行更加详细的分析

89730

Kotlin系列(二)

在进行业务开发时,我们通常会基于官方的框架(kotlinx.coroutines)来运用Kotlin优化异步逻辑,不过这个框架过于庞大和复杂,如果直接接触它容易被劝退。...3.的创建   我们已经给出了的描述,知道了应该具有哪些能力,接下来就需要如何封装的创建了。   ...该作用域包括以下三种: 顶级作用域:没有父所在的作用域为顶级作用域 协同作用域:中启动新的,新为所在的子,这种情况下子所在的作用域默认为协同作用域。...主同作用域:与作用域在的父子关系上一致,区别在于处于该作用域下的出现未捕获的异常时不会将异常向上传递给父。   ...除了这三种作用域中提到的行为外,父子程之间还存在以下规则: 父被取消,则所有的子均被取消 父需要等待子执行完毕后才最终进入完成状态 子会继承父上下文中的元素,如果自身有相同的

22710
领券