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

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

文章目录 一、Android 中出现异常导致应用崩溃 二、Android 中使用异常处理器捕获异常 三、Android 全局异常处理器 一、Android 中出现异常导致应用崩溃 --...-- 在前几篇博客示例中 , 中 如果出现异常 , 没有进行捕获 , 则程序直接崩溃 , 这种情况下需要进行 异常捕获 以 避免 Android 应用程序崩溃 ; 示例代码 : package...上下文 异常处理器 CoroutineExceptionHandler 元素 ; 代码示例 : package kim.hsl.coroutine import android.os.Bundle...java.lang.IllegalArgumentException 三、Android 全局异常处理器 ---- Android 中 全局异常处理器 , 可以 获取 所有的 中产生 没有被捕获异常...; ④ 创建 全局异常处理器 MyCoroutineExceptionHandler 自定义类 , 需要 实现 CoroutineExceptionHandler 接口 ; 并覆盖接口中

1.3K10

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

异常捕捉示例 一、异常处理器 CoroutineExceptionHandler 捕获异常 ---- 在 【Kotlin 上下文 ( 上下文构成要素 | 指定上下文元素组合...进行捕获 , 异常满足如下两个条件才会被捕 : 异常捕获时机 : 自动抛出 异常 , 可以在内被捕获 ; 使用 launch 构建 可以在中捕获异常 , 使用 async 构建...在 await 处捕获异常 ; 异常捕获位置 : 在 作用域 CoroutineScope 或者在 根 中 捕获 异常 ; 1、对比 launch 和 async 创建异常捕捉示例..., 但是 async 创建异常直接抛出导致程序崩溃 ; 14:35:22.587 I CoroutineExceptionHandler 中处理异常...(Job()) 创建 , 则异常不会被捕获到 ; package kim.hsl.coroutine import android.os.Bundle import android.util.Log

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

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

文章目录 一、SupervisorJob 二、supervisorScope 作用域构建器函数 在上一篇博客介绍了 异常处理 【Kotlin 异常处理 ① ( 根异常处理..., 会将异常 传递给 父 , 父会执行如下操作 : ① 取消子 : 不仅仅取消产生异常 , 该父下所有的子都会取消 ; ② 取消父 : 将父本身取消 ; ③ 向父传播异常...: 继续将异常传播给 父 ; 这样就会导致 某个子一旦出现异常 , 则 兄弟 , 父 , 父兄弟 , 父 等等 都会被取消 , 这样牵连太大 , 因此本篇博客中引入几种异常处理机制解决上述问题...; 一、SupervisorJob ---- SupervisorJob 执行时如果 该类型 出现异常 , 不会异常传递给 父 , 因此也不会影响到 父 其它子...; SupervisorJob 类型 自己处理异常 , 不会向上传递异常 ; Android 使用场景 : 某个 View 组件由 多个协程控制 , 如果其中某个协崩溃 , 其它仍正常工作

65010

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

receive 处抛出异常 ) 2、异常捕获点 ( 在 await、receive 处捕获异常 ) 四、非根异常处理 五、异常传播特性 一、异常处理 ---- 在 任务 中 , 执行代码出现异常..., 则需要 用户 通过 await 或 receive 来处理异常 ; 注意 : 下面讨论情况是 根 异常传播 ; 二、根自动传播异常 ---- 自动传播异常 : 使用 launch 或...actor 构建器 创建 , 如果出现异常 , 会 马上抛出异常 ; 此类异常 在 可能出现异常代码位置 进行捕获即可 ; 注意 : 下面讨论情况是 根 异常传播 ; 1、异常抛出点...---- 运行时 , 产生异常 , 会将异常 传递给 父 , 父会执行如下操作 : ① 取消子 : 不仅仅取消产生异常 , 该父下所有的子都会取消 ; ② 取消父...: 将父本身取消 ; ③ 向父传播异常 : 继续将异常传播给 父 ;

65610

Kotlin-特殊阻塞

阻塞是种特殊启动方式,一般是用 runBlocking{} 扩起来一段。...这里给出结果,改用GlobalScope.launch之后,子会在一个独立线程里运行。 runBlocking 在kotlin官网上对于这个api解释是桥接阻塞与非阻塞世界。...但实际情况跟注释有点不同,如果在 runBlocking 中开一个 GlobalScope.launch,并且在里面延时很久,那么外面的线程其实是不会等待 GlobalScope 里完成。...在创建完coroutine后就进入派发流程了,这部分和Kotlin-一个生命周期中逻辑比较相似,下面也会讲到。...这个问说明,runBLocking{}这种,它运行逻辑是先把父放队列里,然后取出来执行,执行完毕再把子入队,再出队子,用同样方式递归。

2.3K20

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

关键词:Kotlin 异常处理 异步代码异常处理通常都比较让人头疼,而则再一次展现了它威力。 1....supervisorScope 同样继承外部作用域上下文,但其内部取消操作是单向传播,父向子传播,反过来则不然,这意味着子出了异常不会影响父以及其他兄弟。...,顺序上差异是线程调度前后造成,并不会影响语义。...join 和 await 不同:join 只关心是否执行完,await 则关心运行结果,因此 join 在出现异常时也不会抛出该异常,而 await 则会;考虑到作用域问题,如果异常...,可能会导致父取消,因此调用 join 时尽管不会本身异常进行抛出,但如果 join 调用所在被取消,那么它会抛出取消异常,这一点需要留意。

1.3K10

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

文章目录 一、异常传播特殊情况 1、取消子示例 2、子抛出异常后父处理异常时机示例 二、异常聚合 ( 多个子抛出异常会聚合到第一个异常中 ) 一、异常传播特殊情况 ---- 在...【Kotlin 异常处理 ① ( 根异常处理 | 自动传播异常 | 在体捕获异常 | 向用户暴露异常 | 在 await 处捕获异常 | 非根异常处理 | 异常传播特性 ) 博客中介绍到...; ③ 向父传播异常 : 继续将异常传播给 父 ; 但是也有特殊情况 : 调用 Job#cancel() 函数 进行取消操作时 , 会 抛出 CancellationException...异常 , 该异常是正常操作 , 会被忽略 ; 如果 抛出 CancellationException 异常 取消 子 , 其 父 不会受其影响 ; 如果 子 抛出是 其它异常 , 该异常会被传递给...主线程 一直占用线程 , 子无法执行 ; 子执行起来后 , 取消子 , 此时 在子中 , 会抛出 CancellationException 异常 , 该异常不会传递到 父 中 ,

70010

kotlin-异常处理机制分析

背景 使用kotlin一段时间了,常用用法也已经很熟悉,但都是停留在使用阶段,没有对代码深入了解过,还是感觉有点虚;趁着过年这段时间,针对异常处理,对其相关源码学习了一波,梳理总结一下自己理解...本文基于 Kotlin v1.4.0,Kotlin-Coroutines v1.3.9源码分析 1、CoroutineScope源码分析 作用:创建和追踪,管理不同程之间父子关系和结构 创建方式...,不会把job取消(会打印“4”),而且异常是job2所在抛出来 3、异常处理流程源码分析 3.1、三层包装 第一层:launch和async返回job,封装了状态,提供取消协接口...,首先会取消所有子 2、异常属于 CancellationException 时,不会取消父 3、使用SupervisorJob和supervisorScope时,即主从作用域,发生异常不会取消父...小结 1、默认作用域是协同作用域,异常会传播到父处理,即 coroutineScope或者CoroutineScope(Job())这种形式 2、作用域如果是主从作用域,异常不会传播到父处理

89530

Kotlin上下文和异常处理

接下来父级会进行下面几步操作: 取消它自己子级 取消它自己 将异常传播并传递给它父级 SupervisorJob和SupervisorScope 使用SupervisorJob时,一个子运行失败不会影响其他...,SupervisorJob不会传播异常给它父级,它会让子自己处理异常 或者SupervisorScope中,一个失败,其他不会受影响,但如果是作用域里面有异常失败,则所有子都会失败退出...全局异常处理器可以获取到所有未处理未捕获异常,不过它不能对异常进行捕获。...取消与异常紧密相关,内部使用CancellationException来取消异常,但这个异常会被忽略 当子被取消时,不会取消它 如果一个遇到了CancellationException...以外异常,它将使用该异常取消它

5510

kotlin--上下文、异常处理

,全新上下文,runBlocking 是主线程上下文,所以当a开启任务时,不会阻塞主线程,当我们进程都跑完了,jobA finished肯定不会打印了 例子2: fun `test context...,也不会影响上下文继承关系,主还是会等待子执行完毕后才结束生命 如果你已经完全理解了,那么就可以知道以上例子使用async启动也是一样效果 二、异常传递 1.异常传播也是遵循了上下文机制...,除了取消异常(CancellationException)外,当一个有了异常,如果没有主动捕获异常,那么异常会向上传播,直到根,子异常都会导致根退出,自然其他子也会退出 例子1:...,当然会导致退出,我们可以在await时候捕获下这个异常,就不会影响主线程上下文运行了 fun `test coroutineScope exception4`() = runBlocking...,很明显这个异常是调用job3时输出,由此又可以推断出,如果在等待任务结束时,任务出现异常并且手动捕获异常后,再启动子时,也会抛出异常,并且不可捕获 注意:新版本kotlin已修复这个bug,不会抛出异常

92510

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

文章目录 一、取消 二、作用域取消 三、作用域子取消 四、通过抛出异常取消协 1、Job#cancel 函数 2、默认异常取消协 3、自定义异常取消协 一、取消 ----...取消 : 取消协作用域 : 取消 作用域 会将该作用域中 所有 子 一同取消 ; 取消子 : 子 取消 不会影响 同一层级 兄弟执行 ; 通过抛出异常取消协 : 取消通常会通过...= null) 取消协时 , 可以传入一个 CancellationException 异常实例对象 , 也可以不传 , 默认为 null ; // 取消协作用域中 job1.cancel(...) 也可以传入一个 自定义 CancellationException 类型异常 , 取消协 ; // 取消协作用域中 job1.cancel(CancellationException(..."自定义 CancellationException 异常")) 由于报出 CancellationException 异常是正常情况 , 如果需要查看该异常 , 需要在中使用 try catch

80020

java框架quasar和kotlin

而反观,基于固定几个线程调度,可以轻松实现百万级处理,而且内存稳稳。 后记 最后,博主以为Quasar只是一个框架层面的东西,所以就又去看了下同样是jvm语言kotlin。...,有种震惊赶脚,kotlin同步模型牛逼呀,瞬时感觉到发现了java里骚操作了,可以使用kotlin来代替java中多线程操作。...所以就有下面这个kotlin实现代码: @Service class KotlinAsyncService(private val weatherService: GetWeatherService...io操作,io操作是阻塞并发也就变成了调度几个线程并发了。...而且当我把同样代码放到Quasar中时候,Quasar直接抛io异常了,说明Quasar还并不能轻松支持这个场景。

33330

Kotlin---使用

第一个 在使用程之前,需要保证Kotlin-Gradle-Plugin版本高于1.3。目前最高版本为1.3.11。...并且这样执行,并不会阻塞主线程执行 delay函数只能在中使用,否则编译不过,尽量避免使用GlobalScope.launch创建,当我们使用 GlobalScope.launch 时...如果我们忘记保持对新启动引用,它还会继续运行。 阻塞runBlocking GlobalScope.launch启动了一个线程创建新,并没有阻塞当前线程。...,并且不会阻塞当前线程 在runBlocking中调用launch()会在当前线程中执行 main @coroutine#1...launch 2 coroutines main @coroutine...,会等待coroutineScope中都执行完毕后,才会继续执行 挂起函数 当代码超级多时候,通常都会把这些代码提取到一个函数中。

1.2K20

Kotlin 挂起和恢复 ② ( 挂起 和 线程阻塞 对比 )

文章目录 一、挂起 和 线程阻塞 对比 1、挂起 2、线程阻塞 3、挂起和阻塞对 UI 影响 4、挂起分析 一、挂起 和 线程阻塞 对比 ---- 挂起是概念 , 只能在中使用...; 阻塞是线程中概念 , 可以在主线程和子线程中使用 ; 1、挂起 挂起 操作 : 在中使用 delay 函数 , 挂起 20 秒时间 , 然后 20 秒后更新 UI ; delay... 挂起 操作 不会出现 阻塞 UI 刷新情况 , 挂起 20 秒不影响 UI 刷新显示 ; 但是如果将主线程阻塞 , UI 不再刷新 , 会出现 ANR 崩溃异常 ; 图形化 GUI 系统中..., 一般都在主线程中更新 UI , 主线程中都有一个无限循环 , 不断刷新界面 , 如果在主线程中执行了耗时操作 , 就会影响到界面的刷新 , 出现漏帧 , ANR 崩溃异常 ; 4、挂起分析 中有挂起操作..., 会将挂起点状态保存 , 同时停止执行 , 等待挂起函数执行完毕后 , 继续执行 ; 相当于阻塞 , 不会阻塞主线程 ;

1.7K20

Kotlin 挂起和恢复 ① ( 挂起和恢复概念 | suspend 挂起函数 )

文章目录 一、挂起和恢复概念 二、 suspend 挂起函数 一、挂起和恢复概念 ---- 函数 最基本操作 是 : 调用 call : 通过 函数名或函数地址 调用函数 ; 返回...return : 函数执行完毕后 , 继续执行函数调用下一行代码 ; 在 调用 call 和 返回 return 基础上 , 又新增了两种 状态 : 挂起 Suspend : 暂停当前执行..., 在子线程中执行异步任务后 , 会马上执行后续代码 , 只是相当于 普通多线程操作 ; 作用就是 可以 顺序地执行 异步任务 和 主线程任务 , 其执行顺序按照代码顺序执行 ; 挂起 函数..., 只能在 体内部 或者 其它挂起函数 中调用 ; 外部不允许使用挂起函数 ; 在中 , 执行 挂起 Suspend 函数 , 将 挂起点信息 记录下来 , 然后执行耗时操作 , 执行完毕后...){} 中 , 可以直接调用挂起函数 ; 挂起 函数 , 只能在 体内部 或者 其它挂起函数 中调用 ; 外部不允许使用挂起函数 ; 在中 , 执行 挂起 Suspend 函数 , 将 挂起点信息

1.5K40

Kotlin---使用异步

通信 间不能直接通过变量来访问数据,会导致数据原子性问题,所以提供了一套Channel机制来在间传递数据。...所以这里保证所有先前发送出去元素都在通道关闭前被接收到。 基于生产者\消费者 在中,可以通过produce来模拟生产者生产数据。并且通过consume来模拟消费者情况。...它启动了一个单独,这是一个轻量级线程并与其它所有的一起并发工作。...、被限制并封装到该状态以及一个与其它通信 通道 组合而成一个实体。...一个 actor 是一个,而一个是按顺序执行,因此将状态限制到特定可以解决共享可变状态问题。实际上,actor 可以修改自己私有状态,但只能通过消息互相影响(避免任何锁定)。

2.7K20

揭秘kotlinCoroutineContext

前言 -- 从kotlin1.1开始,就被添加到kotlin中作为实验性功能,直到kotlin1.3,kotlinapi已经基本稳定下来了,现在kotlin已经发布到了1.4,为添加了更多功能并进一步完善了它...,所以我们现在在kotlin代码中可以放心引入kotlin并使用它,其实并不是kotlin独有的功能,它是一个广泛概念,协作式多任务实现,除了kotlin外,很多语言如Go、Python等都通过自己方式实现了...,它结构很简单, 我们平时开发一般是不会去指定一个CoroutineName,因为CoroutineName只在kotlin调试模式下才会被用, 它在debug模式下被用于设置运行线程名字...还有子抛出未捕获异常会委托父CoroutineExceptionHandler处理,子设置CoroutineExceptionHandler永远不会生效(SupervisorJob 除外...当父同时抛出多个异常时,CoroutineExceptionHandler只会捕获第一个抛出异常,后续抛出异常被保存在第一个异常suppressed数组中,如下: fun main

1.8K30
领券