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

取消和异常 | 异常处理详解

接下来,本文将会解释异常是如何在间传播,以及一些处理它们方法,从而帮您做到一切尽在掌握。...△ 异常会通过层级不断传播 虽然在一些情况下这种传播逻辑十分合理,但换一种情况您可能就不这么想了。...处理异常使用一般 Kotlin 语法处理异常: try/catch 或内建工具方法,比如 runCatching (其内部还是使用了 try/catch) 前面讲到,所有捕获异常一定会被抛出...这就是为什么没有必要将它也包裹进 try/catch ,await 将会抛出 async 中产生所有异常。...⚠️ 在 coroutineScope builder 或在其他创建抛出异常不会被 try/catch 捕获

1.1K20

如何优雅处理异常

因为在这种情况下,每个新总是被分配一个新 Job,这个新 Job 覆盖了 SupervisorJob 。SupervisorJob 是父通过 scope.launch 创建。...scope,并导致所有由其启动被取消。...异常处理 ‍ 在,可以使用常规语法来处理异常:try/catch 或者内置函数 runCatching (内部使用了 try/catch) 。 我们之前说过 捕获异常始终会被抛出 。...CoroutineExceptionHandler 异常处理器 CoroutineExceptionHandler 是 CoroutineContext 一个可选元素,它可以帮助你 处理捕获异常...当你要避免因异常自动传播造成取消时,记住使用 SupervisorJob ,否则请使用 Job 。 捕获异常将会被传播,捕获它们,提供良好用户体验!

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

Kotlin | 关于异常处理,你想知道都在这里

---- 异常传播流程 默认情况下,任意一个发生异常时都会影响到整个协树,而异常传递通常是双向,也即会向子与父共同传递,如下方所示: 整体流程如下: 先 cancel 子 取消自己...但大多数情况下,tryCatch 依然万金油一般,稳定且可靠。...但需要注意是,CoroutineExceptionHandler 仅在捕获异常上调用,也即这个异常没有任何方式处理时(比如在源头tryCatch了),由于是结构化,当子发生异常时,它会优先将异常委托给父区处理...默认情况下,如果 异常没有被处理,而且顶级 CoroutineContext 没有携带 CoroutineExceptionHandler ,则异常会传递给默认线程 ExceptionHandler...Log.e("petterp", "自动捕获所有异常") } val ktxScope = CoroutineScope(SupervisorJob() + exceptionHandler) 参考 取消和异常

78620

Kotlin上下文和异常处理

,SupervisorJob不会传播异常给它父级,它会让子自己处理异常 或者SupervisorScope,一个失败,其他也不会受影响,但如果是作用域里面有异常失败,则所有都会失败退出...异常捕获 使用CoroutineExceptionHandler对异常进行捕获 时机:异常是被自动抛出异常抛出(使用launch,而不是async时) 位置:在CoroutineScope...CoroutineContext或在一个根(CoroutineScope或者supervisorScope直接子 handler要安装在外部,不能在内部,否则捕获不到异常...) { throw IllegalArgumentException() } } } Android全局异常处理 全局异常处理器可以获取到所有未处理捕获异常...当多个子因为异常而失败时,一般情况下取第一个异常进行处理。

5910

再谈程之异常到底怎么办

作用域cancel 借助作用域管理,我们可以轻松控制该作用域下所有,一旦取消一个作用域,那么这个协作用域下所有都将被取消。...这就是结构化并发两个特点: 取消一个作用域,将取消该作用域下所有 被取消,不会影响其它同级 在Android开发,大部分场景下我们不需要考虑cancel,借助...: 发生异常被cancel 异常传递到它cancel(取消其所有) 将异常树上进一步向上传播 这种行为实际上是符合结构化并发规则,但是在实际使用,这种结构化异常处理...而CoroutineScope也很有用,因为你可以在一个发生异常时,取消其关联所有,做为统一处理。...,那么异常将被继续传递直到抛出,但如果设置了CoroutineExceptionHandler,那么则可以在这里处理捕获异常,CoroutineExceptionHandler创建如下所示。

66710

kotlin--上下文、异常处理

.CoroutineName:名字,一般输出日志用 4.CoroutineExceptionHandler:处理捕获异常 上下文实现了运算符重载,我们可以用+号来组合一个CoroutineContext...元素 2.一般情况下体内所有的子,都继承至根继承关系不是我们所了解继承关系,而是父和子生命周期关系,还记得我们上面举得例子么,除非在体内自己手动创建作用域...catch并没有生效,所以向用户暴露异常只适用于不同上下文(没有继承关系) 三、异常处理 1.如果想要一个出现异常后,不影响其继承关系其他,可以使用SupervisorJob...不过它并不能阻止退出,只能够获取异常信息 它使用有两个条件: 1.异常是自动抛出异常(launch) 2.实例化CoroutineScope时候指定异常捕获器 或者 在一个根 例子1...try catch 那么println("job delay")都不会执行 由例子4和例子5,我们可以推断,如果子异常发生了,我们在等待时捕获异常后,根执行了挂起函数,那么它会直接中断,执行挂起函数以下代码

92510

kotlin-异常处理机制分析

大家好,我叫; 本人于2020年10月加入37手游团队; 目前主要负责国内相关业务开发和一些日常业务。...,不会把job取消(会打印“4”),而且异常是job2所在抛出来 3、异常处理流程源码分析 3.1、三层包装 第一层:launch和async返回job,封装了状态,提供取消协接口...//使用SupervisorJob和supervisorScope时,子出现捕获异常时也不会影响父, //它们原理是重写 childCancelled() 为override...,首先会取消所有 2、异常属于 CancellationException 时,不会取消父 3、使用SupervisorJob和supervisorScope时,即主从作用域,发生异常不会取消父...,launch式捕获异常只是打印异常堆栈信息,如果使用了 CoroutineExceptionHandler 的话,只会使用自定义 CoroutineExceptionHandler 处理异常

89930

笔记 | 初探Kotlin

如何理解 是一种不同于进程和线程存在,其本质是一种函数,同一线程多个协是串行执行,但为了理解仍然需要三者一起对比。...info: 我认为关于全部,最佳参考为Google官方编写文章: 谷歌开发者:在 Android 开发中使用 | 背景介绍 在开发中使用 Kotlin 1.3版本开始引入了一种全新处理并发方式...在 Kotlin 所有都必须在调度器运行,即使它们是在主线程上运行也是如此。suspend并不代表后台执行,在哪里执行由调度器决定。可以自行暂停,而调度器负责将其恢复。...CoroutineScope 会跟踪它使用 launch 或 async 创建所有。您可以随时调用 scope.cancel() 以取消正在进行工作(即正在运行)。...不过,与调度程序不同,CoroutineScope 运行

53320

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

CoroutineExceptionHandler , 用于 在捕获异常 ; 异常捕获 : 在 , 使用 CoroutineExceptionHandler 对运行过程中产生 异常...进行捕获 , 异常满足如下两个条件才会被捕 : 异常捕获时机 : 自动抛出 异常 , 可以在内被捕获 ; 使用 launch 构建 可以在捕获异常 , 使用 async 构建...在 await 处捕获异常 ; 异常捕获位置 : 在 作用域 CoroutineScope 或者在 根 捕获 异常 ; 1、对比 launch 和 async 创建异常捕捉示例...在上面的小节验证了 异常捕获位置 在根 情况 , 在本小节示例 , 验证在 作用域 CoroutineScope 捕获异常 ; 代码示例 : 在 作用域 , 使用 launch...val job = scope.launch(coroutineExceptionHandler) 代码 , 在构建器传入了 异常处理器 , 因此该异常处理器 可捕获传递给父异常

1.1K20

笔记

,才在子线程执行挂起函数 ; 如果在主线程启动 , 则该模式就会直接在主线程执行 ; 如果在子线程启动 , 则该模式就会直接在子线程执行 ; 异常处理 对于不同构造器...分别介绍 launch 和 async 情况下异常处理 Launch launch 方式启动异常会在发生时立刻抛出,使用 try catch 就可以将异常捕获。...或 supervisorScope 直接子时,异常在调用 await 时抛出,使用 try catch 可以捕获异常: fun main() = runBlocking { val deferred...但在 Android 开发同样推荐这种用法,因为它生命周期会只受整个应用程序生命周期限制,且不能取消。...其他环境下使用 其他情况下创建按照上面推荐第三种方式即可

81930

在 Android 开发中使用 | 上手指南

为了确保所有都会被追踪,Kotlin 不允许在没有使用 CoroutineScope 情况下启动新。...注意: 被挂起时,系统会以抛出 CancellationException 方式协作取消协捕获顶级异常 (Throwable) 异常处理程序将捕获异常。...但有时候,可能会遇到稍微复杂点问题,例如您需要在一个同时处理两个网络请求,这种情况下需要启动更多。...下一步 本篇文章,我们探讨了如何在 Android ViewModel 启动,以及如何在代码运用结构化并发,来让我们代码更易于维护和理解。...在下一篇文章,我们将探讨如何在实际编码过程中使用,感兴趣读者请继续关注我们更新。

1.4K20

kotlin--启动和取消

,会等到所有运行完毕后才结束 2.join Jobjoin函数,会让后面的等待当前执行完毕后再执行 fun `test join build`() = runBlocking {...3.LAZY:只有被需要时,包括主动调用start、join或await等函数时才会开始调度,如果调度前被取消,那么该将直接进入异常结束状态 4.UNDISPATCHED:创建后立即在当前函数调用栈执行...,那么其所有都会退出并结束 2.coroutineScope与supervisorScope supervisorScope,一个子出错了,不会影响其他子 fun `test supervisorScope...3.取消资源释放 1.可以捕获取消异常,然后在finally释放 2.use函数,该函数只能被实现了closeable对象使用,程序结束时,会自动调用close方法,适合文件对象 4.不能取消任务...处于取消状态不能被挂起,如果想要取消后,还能调用挂起函数,我们需要将清理代码放入NoCancellable CoroutineContext 这样会挂起运行代码,并保持取消状态

95230

kotlin 入门教程

CoroutineExceptionHandler:处理捕获异常 它们与 CoroutineContext 关系如下图所示: Job Job 可以监测并操控,可以说是句柄。...Executors.newCachedThreadPool().asCoroutineDispatcher()) { } CoroutineExceptionHandler CoroutineExceptionHandler 用来处理捕获异常...处理复杂结构异常时,它仅在顶层起作用。...异常 由于本质是线程池任务,并且本身是结构化,这就导致它异常处理机制与我们普通程序完全不一样。下面将介绍我们处理异常需要注意点。...由于这个特点,导致了一个异常会影响到其他所有。如下图所示,当子1发生异常时,它会先会传递给父,再从父传播到子2和3,从而影响所有

14610

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

-- 在前几篇博客示例 , 如果出现异常 , 没有进行捕获 , 则程序直接崩溃 , 这种情况下需要进行 异常捕获 以 避免 Android 应用程序崩溃 ; 示例代码 : package...java.lang.IllegalArgumentException 三、Android 全局异常处理器 ---- Android 全局异常处理器 , 可以 获取 所有 中产生 没有被捕获异常...处理捕获异常 " + "\n上下文 ${context}" + "\n抛出异常 ${exception}") } } ⑤...全局异常处理器 处理捕获异常 上下文 [StandaloneCoroutine{Cancelling}@8252a7e, Dispatchers.Default...处理捕获异常 , 但是程序依然崩溃 , 可以在 全局异常处理器 获取到异常信息 ;

1.3K10

取消和异常 | 核心概念介绍

本次系列文章 "取消和异常" 也是 Android 相关内容,我们将与大家深入探讨关于取消操作和异常处理知识点和技巧。...(Job() + Dispatchers.Main) val job = scope.launch { //新 } Job Job 用于处理。...在下面的代码片段,除了通过 CoroutineScope 创建新,来看看如何在创建更多: val scope = CoroutineScope(Job() + Dispatchers.Main...当所有的子都完成后,会进入已取消 (Cancelled) 状态,此时 isCompleted = true。...现在,大家了解了一些基本概念,在接下来文章,我们将在第二篇继续深入探讨取消、第三篇探讨异常处理。

98110

禁止在代码中使用异常,一次时隔7年复盘

导读 2017 年,某业务团队通过某次技术会议确定禁止在代码中使用异常,当时目的旨在规范一些存在基本问题,诸如:使用异常导致冲突,捕获异常和抛出不一致;捕获异常导致后端框架 worker...当时坚决反对使用异常同事提出: 使用异常导致冲突,捕获异常和抛出不一致; 捕获异常导致后端框架 worker 进程终止,重启 worker 进程漫长导致效率很差。...根据上述结果我们可以得到一些简单结论: 任何情况下,全局变量是不安全,只要是使用了多或多线程,读取和写入不具备连续性; 在不使用多线程情况下,理论上全局变量只要保证在抛出并且捕获之间保证不发生切换是安全...捕获异常导致框架 worker 进程终止,重启 worker 进程漫长导致效率很差。...那么在 libco 使用情况下,如何安全使用异常呢? 只需要关心 catch 块是否会发生切换,如果 catch 块代码确定不会发生切换就是安全

2.6K34

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

当然,这并不算是一个全局异常捕获,因为它只能捕获对应捕获异常,如果你想做到真正全局捕获,在 Jvm 上我们可以自己定义一个捕获类实现: class GlobalCoroutineExceptionHandler...coroutineScope 是继承外部 Job 上下文创建作用域,在其内部取消操作是双向传播,子捕获异常也会向上传递给父。...,出现捕获异常会尝试传递给父并尝试取消父。...不同之处在于, launch 捕获异常与 async 处理方式不同, launch 会直接抛出给父,如果没有父(顶级作用域中)或者处于 supervisorScope 不响应,那么就交给上下文中指定...这一块儿稍微显得有点儿复杂,但仔细理一下主要有三条线: 内部异常处理流程:launch 会在内部出现捕获异常时尝试触发对父取消,能否取消要看作用域定义,如果取消成功,那么异常传递给父

1.3K10
领券