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

kotlin协程,启动如何处理异常

Kotlin协程是一种轻量级的并发编程框架,用于简化异步操作和多线程编程。它基于协程的概念,允许开发者以顺序的方式编写异步代码,而无需显式地管理线程。

在Kotlin协程中,异常处理是一个重要的方面。当协程中的代码抛出异常时,可以通过以下方式处理异常:

  1. 使用try-catch块:可以在协程代码块内使用try-catch语句来捕获和处理异常。这样可以在发生异常时执行特定的错误处理逻辑。
  2. 使用CoroutineExceptionHandler:可以通过CoroutineExceptionHandler来全局处理协程中的异常。通过设置一个统一的异常处理器,可以在所有协程中捕获和处理异常。例如:
代码语言:txt
复制
val exceptionHandler = CoroutineExceptionHandler { _, throwable ->
    // 处理异常的逻辑
}

GlobalScope.launch(exceptionHandler) {
    // 协程代码块
}
  1. 使用supervisorScope:在某些情况下,我们可能希望在协程中的异常发生时,只取消当前的子协程而不影响其他协程。这时可以使用supervisorScope来创建一个独立的作用域,使得异常只会影响当前的子协程。例如:
代码语言:txt
复制
supervisorScope {
    launch {
        // 子协程1
    }
    launch {
        // 子协程2
    }
}

以上是处理Kotlin协程中异常的常见方法。Kotlin协程的异常处理能力使得开发者能够更加方便地处理异步操作中的错误情况,提高代码的可读性和可维护性。

关于腾讯云相关产品和产品介绍链接地址,由于要求不能提及具体品牌商,无法给出相关链接。但腾讯云提供了丰富的云计算服务,包括云服务器、云数据库、云存储等,可以根据具体需求选择适合的产品。

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

相关·内容

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

文章目录 一、异常处理器 CoroutineExceptionHandler 捕获异常 1、对比 launch 和 async 创建的异常捕捉示例 2、验证 CoroutineScope...异常捕捉示例 一、异常处理器 CoroutineExceptionHandler 捕获异常 ---- 在 【Kotlin 上下文 ( 上下文构成要素 | 指定上下文元素组合...| 上下文元素的继承关系 | 上下文元素的几种指定形式 | 默认 | 继承 | 自定义指定 ) 博客中 , 介绍了 上下文 CoroutineContext 组成要素 , 其中包含了 异常处理器...时 , 使用的 CoroutineScope(Job()) 进行创建 , 不是 SupervisorJob , 因此 在子中抛出的异常 , 会传递给父 , 由父处理异常 , 父创建时使用的...val job = scope.launch(coroutineExceptionHandler) 代码 , 在构建器中传入了 异常处理器 , 因此该异常处理器 可捕获 子传递给父异常

1.2K20

破解 Kotlin (4) - 异常处理

关键词:Kotlin 异常处理 异步代码的异常处理通常都比较让人头疼,而则再一次展现了它的威力。 1....通过 GlobeScope 启动单独启动一个作用域,内部的子遵从默认的作用域规则。通过 GlobeScope 启动“自成一派”。...它更适合一系列对等的并发的完成一项工作,任何一个子异常退出,那么整体都将退出,简单来说就是”一损俱损“。这也是内部再启动的默认作用域。...小结 这一篇我们讲了异常处理。...这一块儿稍微显得有点儿复杂,但仔细理一下主要有三条线: 内部异常处理流程:launch 会在内部出现未捕获的异常时尝试触发对父的取消,能否取消要看作用域的定义,如果取消成功,那么异常传递给父

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

    文章目录 一、异常处理 二、根自动传播异常 1、异常抛出点 ( 体抛出异常 ) 2、异常捕获点 ( 在体捕获异常 ) 三、根向用户暴露异常 1、异常抛出点 ( 在 await、...receive 处抛出异常 ) 2、异常捕获点 ( 在 await、receive 处捕获异常 ) 四、非根异常处理 五、异常传播特性 一、异常处理 ---- 在 任务 中 , 执行的代码出现异常..., 需要进行 异常处理 , 并给出错误提示信息 , 展示给用户 或者 上报服务器 ; 构建器 有两种 异常处理 形式 : 自动传播异常 : 使用 launch 或 actor 构建器 创建的 根..., 则需要 用户 通过 await 或 receive 来处理异常 ; 注意 : 下面讨论的情况是 根异常传播 ; 二、根自动传播异常 ---- 自动传播异常 : 使用 launch 或...") e.printStackTrace() } } } } 执行结果 : 四、非根异常处理 ---- 非根

    74110

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

    文章目录 一、SupervisorJob 二、supervisorScope 作用域构建器函数 在上一篇博客介绍了 异常处理Kotlin 异常处理 ① ( 根异常处理...| 自动传播异常 | 在体捕获异常 | 向用户暴露异常 | 在 await 处捕获异常 | 非根异常处理 | 异常传播特性 ) , 其中介绍了 异常的传播特性 : 运行时 , 产生异常...: 继续将异常传播给 父的父 ; 这样就会导致 某个子一旦出现异常 , 则 兄弟 , 父 , 父的兄弟 , 父的父 等等 都会被取消 , 这样牵连太大 , 因此本篇博客中引入几种异常处理机制解决上述问题...; SupervisorJob 类型的 子 自己处理异常 , 不会向上传递异常 ; Android 使用场景 : 某个 View 组件由 多个协程控制 , 如果其中某个协崩溃 , 其它仍正常工作...作用域 调用 launch 构建器函数 , 即可 创建 SupervisorJob , 这些可以自己处理异常 , 不会向父传递异常 ; 代码示例 : // 先创建 Supervisor

    73010

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

    文章目录 一、Android 中出现异常导致应用崩溃 二、Android 中使用异常处理器捕获异常 三、Android 全局异常处理器 一、Android 中出现异常导致应用崩溃 --...------- PROCESS ENDED (26587) for package kim.hsl.coroutine ---------------------------- 二、Android 中使用异常处理器捕获异常...---- 在 Android 程序中 , 可以使用 异常处理器 CoroutineExceptionHandler 捕获异常 , 将其实例对象传递给 launch 构建器 作为参数即可 ; 该参数作为...() } } } 执行结果 : 异常处理器 CoroutineExceptionHandler 捕获到了异常 ; 15:47:54.749 I 验证中抛出异常 15:...java.lang.IllegalArgumentException 三、Android 全局异常处理器 ---- Android 中的 全局异常处理器 , 可以 获取 所有的 中产生的 没有被捕获的异常

    1.5K10

    破解 Kotlin (2) - 启动

    本文将为大家详细介绍的几种启动模式之间的不同,当然,我不打算现在就开始深入源码剖析原理,大家只需要记住这些规则就能很好的使用了。 1....再来看看启动 说了这么多线程,原因嘛,毕竟大家对它是最熟悉的。...我们说过,启动需要三样东西,分别是 上下文、启动模式、体,体 就好比 Thread.run 当中的代码,自不必说。 本文将为大家详细介绍 启动模式。...在 Kotlin 当中,启动模式是一个枚举: public enum class CoroutineStart { DEFAULT, LAZY, @ExperimentalCoroutinesApi...这段程序采用默认的启动模式,由于我们也没有指定调度器,因此调度器也是默认的,在 JVM 上,默认调度器的实现与其他语言的实现类似,它在后台专门会有一些线程处理异步任务,所以上述程序的运行结果可能是: 19

    1K30

    Kotlin上下文和异常处理

    的名称,调试的时候很有用 CoroutineExceptionHandler:处理未被捕获的异常 这几个部分可以通过"+"来组合 @Test fun `test coroutine context...,SupervisorJob不会传播异常给它的父级,它会让子自己处理异常 或者SupervisorScope中的子,一个失败,其他的子也不会受影响,但如果是作用域里面有异常失败,则所有子都会失败退出...全局异常处理器可以获取到所有处理的未捕获异常,不过它不能对异常进行捕获。...当父的所有子都结束后,异常才会被父处理 //取消与异常 /* * 打印顺序为: * section 3 * section 1 * section 2 * handle exception:...当的多个子因为异常而失败时,一般情况下取第一个异常进行处理

    8010

    kotlin--上下文、异常处理

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

    94410

    kotlin-异常处理机制分析

    背景 使用kotlin一段时间了,常用的用法也已经很熟悉,但都是停留在使用的阶段,没有对代码深入了解过,还是感觉有点虚;趁着过年这段时间,针对异常处理,对其相关的源码学习了一波,梳理总结一下自己的理解...本文基于 Kotlin v1.4.0,Kotlin-Coroutines v1.3.9源码分析 1、CoroutineScope源码分析 作用:创建和追踪,管理不同程之间的父子关系和结构 创建的方式...,异常由所在的处理 3.3、CoroutineExceptionHandler的是如何生效的 在AbstractCoroutine中,处理异常的逻辑是在JobSupport接口中,默认是空的实现。...小结 1、默认的作用域是协同作用域,异常会传播到父处理,即 coroutineScope或者CoroutineScope(Job())这种形式 2、作用域如果是主从作用域,异常不会传播到父处理...最后,本文异常处理分析是从作用域为切入点进行的,看代码过程中也会学到一些kotlin巧妙的语法使用;另外只是大概的去分析了一下异常处理主线逻辑,有些细节的还需要去继续学习,下次会进行更加详细的分析

    94030

    Kotlin 启动 ④ ( 启动模式 | 构建器启动模式参数 | DEFAULT 模式 | ATOMIC 模式 | LAZY 模式 | UNDISPATCHED 模式 )

    , 该直接报异常 进入异常响应状态 ; 代码示例 : 在下面的代码中 , val job = async (start = CoroutineStart.LAZY) 只是定义 , 并不会马上执行..., // 只有 主动调用的 start , join , await 方法 时 , 才开始调度执行 , // 如果在 调度之前取消协 , 该直接报异常 进入异常响应状态..., 直接进入异常响应状态 //job.cancel() // 执行下面两个方法中的任意一个方法 , // 启动执行 job.start()...* * 如果[Job]在它甚至有机会开始执行之前被取消,那么它将不会启动它的 * 执行,但将以异常完成。...* * 如果[Job]在它甚至有机会开始执行之前被取消,那么它将不会启动它的 * 执行,但将以异常完成。

    1.1K10

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

    文章目录 一、异常传播的特殊情况 1、取消子示例 2、子抛出异常后父处理异常时机示例 二、异常聚合 ( 多个子抛出的异常会聚合到第一个异常中 ) 一、异常传播的特殊情况 ---- 在...【Kotlin 异常处理 ① ( 根异常处理 | 自动传播异常 | 在体捕获异常 | 向用户暴露异常 | 在 await 处捕获异常 | 非根异常处理 | 异常传播特性 ) 博客中介绍到...父 进行处理 ; 如果 父 有多个子 , 多个子 都抛出异常 , 父会等到 所有子 都执行完毕会后 , 再处理 异常 ; 1、取消子示例 在下面的代码中 , 在 父中...代码 2、子抛出异常后父处理异常时机示例 父 中 使用 launch 创建了 2 个 子 , 子 1 执行 2 秒后 , 在 finally 中再执行 1 秒 ; 子 2 执行...中 有多个 子 , 这些子 都 抛出了 异常 , 此时 只会处理 第一个 异常 ; 这是因为 多个 子 , 如果出现了多个异常 , 从第二个异常开始 , 都会将异常绑定到第一个异常上面 ;

    74510

    kotlin--启动和取消

    一、启动 1.launch与async构建器都用来启动 launch:我们之前已经使用过了GlobalScope的launch来启动,它返回一个Job async:返回一个Deferred...println("time : $time") } fun main() { `test combine async`() } 结果: sum : 30 time : 1085 5.启动模式...kotlin有4中启动模式 1.DEFAULT:创建后,立即开始调度,在调度前如果被取消,直接进入取消响应状态 2.ATOMIC:创建后,立即开始调度,执行到第一个挂起点之前不响应取消...3.LAZY:只有被需要时,包括主动调用的start、join或await等函数时才会开始调度,如果调度前被取消,那么该将直接进入异常结束状态 4.UNDISPATCHED:创建后立即在当前函数调用栈中执行...,如果想要取消后,还能调用挂起函数,我们需要将清理的代码放入NoCancellable CoroutineContext中 这样会挂起运行中的代码,并保持的取消中状态,直到任务处理完成 fun

    99530

    Kotlin 启动 ⑤ ( 作用域构建器 | runBlocking 函数 | coroutineScope 函数 | supervisorScope 函数 )

    函数 ) 1、作用域构建器概念 2、coroutineScope 作用域构建器 示例 3、supervisorScope 作用域构建器 示例 一、结构化并发 ---- 在 【Kotlin...底层实现 ② ( 调度器 | 任务泄漏 | 结构化并发 ) 【Kotlin 底层实现 ③ ( 结构化并发 | MainScope 作用域 | 取消协作用域 | Activity...实现 CoroutineScope 作用域接口 ) 【Kotlin 底层实现 ④ ( 结构化并发 | viewModelScope 作用域示例 ) 博客中介绍了 结构化并发 ; 结构化并发的作用...: 任务 运行时 , 必须指定其 CoroutineScope 作用域 , 其会 追踪所有的 任务 , CoroutineScope 作用域 可以 取消 所有由其启动任务 ; 结构化并发...该会在另外的独立的线程执行 任务 , 不会干扰当前启动的线程 ; 函数原型如下 : public suspend fun coroutineScope(block: suspend

    53130

    Kotlin-特殊的阻塞

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

    2.4K20

    Kotlin 启动 ③ ( 组合并发 | 挂起函数串行执行 | 组合并发执行挂起函数 )

    文章目录 一、挂起函数串行执行 二、组合并发执行挂起函数 一、挂起函数串行执行 ---- 在体中 , 连续使用多个挂起函数 , 这些函数的执行是顺序执行的 , 挂起函数 1 执行完毕后 , 才执行...setContentView(R.layout.activity_main) runBlocking { // 调用 runBlocking 函数 , 可以将 主线程 包装成 ...---- 如果想要两个挂起函数并发执行 , 并且同时需要两个函数的返回值 , 则使用 async 构建器 , 启动两个协 , 在体中执行两个并发函数 ; 代码示例 : package kim.hsl.coroutine...setContentView(R.layout.activity_main) runBlocking { // 调用 runBlocking 函数 , 可以将 主线程 包装成 ...async , 并发执行两个挂起函数 , 耗时 355 ms , 达到了并发执行减少执行时间的目的 ; 00:18:50.081 I 两个返回值相加 3 00:18:50.081 I 挂起函数执行耗时

    69320

    Kotlin开篇

    Kotlin》均基于Kotlinx-coroutines 1.3.70 新开个坑,专门讲kotlin。聊程之前先说一下具体聊的是的什么内容。 · 是什么? · 什么时候用?...· 的核心是什么? · kotlin和其他语言的有什么异同? kotlin的出现其实比kotlin语言还晚一点。在当前这个版本,甚至都还处于一个不稳定的迭代版本中。...在Kotlin里使用非常方便, import kotlinx.coroutines.* fun main() { GlobalScope.launch { // 在后台启动一个新的并继续...存活 } 上面的代码是一个常规启动的方式,关键函数只有 launch,delay,这两个函数是kotlin独有的。...这个问题涉及到Kotlin的Scope,调度,也是的实现核心逻辑 Kotlin不是第一个提出的 实际上在Kotlin之前就有不少语言实践了这个概念。比如python,golang。

    89320

    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

    97920

    破解 Kotlin (5) - 取消篇

    关键词:Kotlin 取消 任务停止 的任务的取消需要靠内部调用的协作支持,这就类似于我们线程中断以及对中断状态的响应一样。 1. 线程的中断 我们先从大家熟悉的话题讲起。...完善我们之前的例子 之前我们有个例子,上一篇文章已经加入了异常处理逻辑,那么这次我们给它加上取消逻辑。...父。 4.2 如何正确的将回调转换为 前面我们提到既然 adapt 方法不是 suspend 方法,那么我们是不是应该在其他位置创建呢?...如果 cancel 抛异常而没有捕获的话,那么等同于体内部抛出异常,具体如何传播看所在作用域的相关定义了。...最后我们还分析了一下 Retrofit 的扩展的一些问题和解决方法,这个例子也进一步可以引发我们对作用域以及如何将现有程序化的思考。

    1.8K50
    领券