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

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

文章目录 一、异常处理 二、根自动传播异常 1、异常抛出点 ( 体抛出异常 ) 2、异常捕获点 ( 体捕获异常 ) 三、根向用户暴露异常 1、异常抛出点 ( await、...receive 处抛出异常 ) 2、异常捕获点 ( await、receive 处捕获异常 ) 四、非根异常处理 五、异常传播特性 一、异常处理 ---- 任务 , 执行的代码出现异常...( 体抛出异常 ) launch 构建器 异常代码示例 : 使用 launch 构建器创建 , 任务抛出异常 , 查看异常的抛出点 ; package kim.hsl.coroutine...( 体捕获异常 ) 异常捕获代码示例 : 任务代码可能抛出异常的代码处捕获异常 ; package kim.hsl.coroutine import android.os.Bundle...根异常传播 ; 1、异常抛出点 ( await、receive 处抛出异常 ) 代码示例 : 在下面的代码 , 如果不调用 async 构建的 Deferred 任务 的 await

66310

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

CoroutineExceptionHandler , 用于 捕获异常 ; 异常捕获 : , 使用 CoroutineExceptionHandler 对运行过程中产生的 异常...进行捕获 , 异常满足如下两个条件才会被捕 : 异常捕获时机 : 自动抛出 的异常 , 可以内被捕获 ; 使用 launch 构建的 可以捕获异常 , 使用 async 构建的... await 处捕获异常 ; 异常捕获位置 : 作用域 CoroutineScope 或者 捕获 异常 ; 1、对比 launch 和 async 创建的异常捕捉示例...在上面的小节验证了 异常捕获位置 的情况 , 本小节示例 , 验证 作用域 CoroutineScope 捕获异常 ; 代码示例 : 作用域 , 使用 launch...构建器 创建 , 传入 CoroutineExceptionHandler 实例对象参数 , 在其中再创建子 , 抛出异常 , 最终可以捕获到抛出的异常 ; 下面代码 创建作用域

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

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

文章目录 一、异常传播的特殊情况 1、取消子示例 2、子抛出异常后父处理异常时机示例 二、异常聚合 ( 多个子抛出的异常会聚合到第一个异常 ) 一、异常传播的特殊情况 ---- ...【Kotlin 异常处理 ① ( 根异常处理 | 自动传播异常 | 体捕获异常 | 向用户暴露异常 | await 处捕获异常 | 非根异常处理 | 异常传播特性 ) 博客中介绍到...父 进行处理 ; 如果 父 有多个子 , 多个子 都抛出异常 , 父会等到 所有子 都执行完毕会后 , 再处理 异常 ; 1、取消子示例 在下面的代码 , ...主线程 一直占用线程 , 子无法执行 ; 子执行起来后 , 取消子 , 此时 , 会抛出 CancellationException 异常 , 该异常不会传递到 父 ,...代码 2、子抛出异常后父处理异常时机示例 父 使用 launch 创建了 2 个 子 , 子 1 执行 2 秒后 , finally 再执行 1 秒 ; 子 2 执行

70110

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

文章目录 一、Android 中出现异常导致应用崩溃 二、Android 中使用异常处理器捕获异常 三、Android 全局异常处理器 一、Android 中出现异常导致应用崩溃 --...") throw IllegalArgumentException() } } } 执行结果 : 抛出了异常 , 应用直接退出 ; 15:46:00.444...---- Android 程序 , 可以使用 异常处理器 CoroutineExceptionHandler 捕获异常 , 将其实例对象传递给 launch 构建器 作为参数即可 ; 该参数作为...() } } } 执行结果 : 异常处理器 CoroutineExceptionHandler 捕获到了异常 ; 15:47:54.749 I 验证抛出异常 15:...: 16:30:53.537 I 验证抛出异常 16:30:53.578 D Skia GL Pipeline 16:30:53.590 I MyCoroutineExceptionHandler

1.3K10

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

⚠️ 为了能够更好地理解本文所讲的内容,建议您首先阅读本系列的第一篇文章: 的取消和异常 | 核心概念介绍。 某个协突然运行失败怎么办?...△ 异常会通过的层级不断传播 虽然一些情况下这种传播逻辑十分合理,但换一种情况您可能就不这么想了。... JVM 异常会被打印控制台;而在 Android ,无论异常在那个 Dispatcher 中发生,都会导致您的应用崩溃。...⚠️ coroutineScope builder 或在其他创建的抛出的异常不会被 try/catch 捕获!...内部会在异常出现时传播异常并传递给它的父级,由于父级并不知道 handler 的存在,异常就没有被抛出。 优雅地处理程序异常是提供良好用户体验的关键,事情不如预期般发展时尤其如此。

1.1K20

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

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

65510

及Python

我们把一个线程的一个个函数叫做子程序,那么子程序执行过程可以中断去执行别的子程序;别的子程序也可以中断回来继续执行之前的子程序,这就是。...比较专业的理解是:   拥有自己的寄存器上下文和栈。调度切换时,将寄存器上下文和栈保存到其他地方,切回来的时候,恢复先前保存的寄存器上下文和栈。...(2)进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序 2 Python如何实现 2.1 yield实现   前文所述“子程序(函数)执行过程可以中断去执行别的子程序;别的子程序也可以中断回来继续执行之前的子程序...2.2 greenlet实现   Python的 greenlet就相当于手动切换,去执行别的子程序,“别的子程序”又主动切换回来。。。 greenlet例子: 1 #!...实现gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级

1.3K20

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

文章目录 一、取消 二、作用域取消 三、作用域子取消 四、通过抛出异常取消协 1、Job#cancel 函数 2、默认异常取消协 3、自定义异常取消协 一、取消 ----...; 然后 , 作用域中 创建两个子 ; 最后 , 取消协作用域 , 同时该作用域内的两个子也一并被取消了 ; package kim.hsl.coroutine import android.os.Bundle...:31:51.937 I job1 子执行完毕 10:31:51.938 I job0 子执行完毕 三、作用域子取消 ---- 单独取消 作用域 的 子 , 作用域...delay(100) // 取消协作用域中的子 job1.cancel() } } } 执行结果 : 作用域 coroutineScope... 启动了 job0 和 job1 两个协 , 取消了 job1 , job1 没有执行完毕 , job0 执行完毕 ; 四、通过抛出异常取消协 ---- 1、Job#cancel

80920

的取消和异常 | 取消操作详解

日常的开发,我们都知道应该避免不必要的任务处理来节省设备的内存空间和电量的使用——这一原则在同样适用。...⚠️ 为了能够更好地理解本文所讲的内容,建议您首先阅读本系列的第一篇文章: 的取消和异常 | 核心概念介绍。...底层实现,子会通过抛出异常的方式将取消的情况通知到它的父级。父通过传入的取消原因来决定是否来处理该异常。...Try catch finally 因为当被取消后会抛出 CancellationException 异常,我们可以将挂起的任务放置于 try/catch 代码块,然后 finally 代码块执行需要做的清理任务...现在,大家了解了本系列的第一部分 的一些基本概念、第二部分的取消,接下来的文章,我们将继续深入探讨学习第三部分异常处理,感兴趣的读者请继续关注我们的更新。

2K20

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

之前的文章里,我们为各位开发者分享了 Android 中使用的一些基础知识,包括 Android 的背景介绍、上手指南和代码实战。...本次系列文章 "的取消和异常" 也是 Android 相关的内容,我们将与大家深入探讨关于取消操作和异常处理的知识点和技巧。...: * 处理未被捕捉的异常未来的第三篇文章里会有详细的讲解。...由于 CoroutineScope 可以创建,而且您可以内部创建更多的,因此内部就会隐含一个任务层级。...现在,大家了解了的一些基本概念,接下来的文章,我们将在第二篇继续深入探讨的取消、第三篇探讨异常处理。

97710

的取消和异常 | 驻留任务详解

本系列第二篇文章 的取消和异常 | 取消操作详解 ,我们学到,当一个任务不再被需要时,正确地退出十分的重要。...的最佳实践 由于本文所介绍的模式是的其它最佳实践的基础之上实现的,我们可以借此机会回顾一下: 1. 将调度器注入到类 不要在创建或调用 withContext 时硬编码调度器。...我们需要在 Application 类创建自己的作用域,并在由它启动的调用这些操作。这个作用域应当被注入到那些需要它的类。...applicationScope 必须包含一个 SupervisorJob(),这样的故障便不会在层级间传播 (见本系列第三篇文章: 的取消和异常 | 异常处理详解): class MyApplication...❌ ✅ 使用 NonCancellable 正如您在本系列第二篇文章 的取消和异常 | 取消操作详解 中看到的,您可以使用 withContext(NonCancellable) 在被取消的调用挂起函数

1.4K20

python-异常处理和错误调试-异常处理(一)

Python 是一种轻量级的线程,可以同一个线程内执行多个任务,从而实现高效的并发编程。异常处理和错误调试也是非常重要的,因为异步编程,错误很容易出现并且难以调试。...一、异常处理异常处理的基本概念在异常处理是指程序出现错误时,如何捕获和处理这些错误。Python 异常处理机制可以通过 try-except-finally 语句实现。...try 语句块包含可能会出现异常的代码,如果在 try 语句块中出现异常,则会跳转到对应的 except 语句块进行异常处理。finally 语句块的代码无论是否出现异常都会执行。...("除数不能为0")finally: # 无论是否出现异常都会执行 print("程序执行结束")异常处理的方式异常处理可以通过两种方式实现:(1)使用 try-except-finally...(2)使用 asyncio 模块提供的异常处理机制,可以通过中使用 async with 上下文管理器实现。当中出现异常时,会自动调用异常处理函数进行处理。

89330

python-异常处理和错误调试-异常处理(二)

二、错误调试,错误调试是指在程序出现错误时,如何查找和修复错误。...通常情况下,的错误调试可以通过以下几个步骤实现:确认错误类型:通过 Python 提供的内置异常类型或者自定义异常类型,确定错误的类型。...下面是一些示例代码,帮助读者更好地理解异常处理和错误调试:import asyncioasync def coro(): try: # 可能会出现异常的代码 a...print(f"发生异常:{e}")asyncio.run(main())在上述示例代码,我们定义了一个函数 coro(),函数中使用 try-except-finally 语句进行异常处理。...然后,主函数中使用 asyncio.Task() 函数创建一个任务,并使用 async with 上下文管理器来自动调用异常处理函数。如果中出现异常,会自动调用异常处理函数进行处理。

1.1K131

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

,我们只需要在我们的代码捕获就可以了,这样做的好处就是,请求的全流程异常都可以一个 try...catch......不同之处在于, launch 未捕获的异常与 async 的处理方式不同, launch 会直接抛出给父,如果没有父(顶级作用域中)或者处于 supervisorScope 不响应,那么就交给上下文中指定的...异常在作用域内的传播:当出现异常时,会根据当前作用域触发异常传递,GlobalScope 会创建一个独立的作用域,所谓“自成一派”,而 coroutineScope 当中异常会触发父的取消...join 和 await 的不同:join 只关心是否执行完,await 则关心运行的结果,因此 join 出现异常时也不会抛出该异常,而 await 则会;考虑到作用域的问题,如果异常...附加说明 join 被取消时有一个 bug 会导致不抛出取消异常,我准备本文时发现该问题,目前已经提交到官方并得到了修复,预计合入到 1.2.1 发版,大家有兴趣可以查看这个 issue:No

1.3K10

java框架quasar和kotlin

接下来要分享的这个开源项目,正是解决了java只能使用多线程模型开发高并发应用的窘境,使得java也能像Go语言那样使用的语义开发了。...而且上面多线程编程时,并没有指定线程池的大小,实际开发是绝不允许的。一般我们会设置一个固定大小的线程池,因为线程资源是宝贵,线程多了费内存还会带来线程切换的开销。...上面的场景设置200个固定大小线程池时。结果也是可预见的达到了50多秒。这个结果足以证明编程ko线程编程了。...java多线程写的一个多线程汇聚多个http接口的结果的接口时,通过ab压测他们两个的性能并没有很大的变化,最后了解到主要原因是这个时候,里发起一个http的请求时,涉及到操作系统层面的socket...而且当我把同样的代码放到Quasar的时候,Quasar直接抛io异常了,说明Quasar还并不能轻松支持这个场景。

33830

KotlinAndroid的应用

(Dispatchers.IO){ } 这两种方式都是指定的 IO 调度器启动一个,但它们之间有一些区别: GlobalScope.launch(Dispatchers.IO){} 是全局范围内启动一个...CoroutineScope(Dispatchers.IO).launch {} 是指定的 CoroutineScope 启动一个,通常情况下应该手动创建 CoroutineScope 对象,并确保合适的时机取消该...比如:网络请求,数据库操作,文件操作等 Main:UI调度器,只有UI编程平台上有意义,用于更新UI,例如Android的主线程 Unconfined:非受限调度器,无所谓调度器,当前可以运行在任意线程上...()) } 那如果我们想在运行改变线程怎么办?...Composable 创建一个记住的(remembered)作用域。

12810

如何优雅的处理异常

优雅的异常处理对用户来说是很重要的。在这篇文章,我会介绍异常是怎么传播的,以及如何使用各种方式控制异常的传播。...异常的处理 ‍ ,可以使用常规语法来处理异常:try/catch 或者内置的函数 runCatching (内部使用了 try/catch) 。 我们之前说过 未捕获的异常始终会被抛出 。...但是不同的构建器对于异常有不同的处理方式。 Launch launch 异常一旦发生就会立马被抛出 。因此,你可以使用 try/catch 包裹会发生异常的代码。...为了处理 async 抛出的异常,你可以 try/catch 调用 await 。...throw Exception("Failed coroutine") } } 下面的另一个例子,handler 一个内部中使用,它不会捕获异常: val scope = CoroutineScope

1K30

lua--异常处理、面向对象

一、 是单核的,是一个线程下执行的,所以每一时刻只会有一个在运行。线程一般由cpu调度,由用户调用 1....的暂停和继续 还可以通过代码暂停执行和继续执行 2.1 暂停 coroutine.yield:暂停 定义的function,执行暂停方法: -- 暂停、继续 cor3 = coroutine.create...,我们知道了,每次定义的function调用yield,都必须再次调用resume才能继续执行,而接收返回值的方法就是resume,所以猜想每次yield,都会有返回值,下面就来测试下...运行结果: 三、面向对象 lua面向对象是通过table来实现的,table的元素可以是不同数据类型,也可以是一个函数 1....答案是结合:和使用元表,function table名.函数名方式时,将.替换成:,就可以函数内部使用self来获取自身,此时使用元表的__index,将self和一张空表结合,返回出去,就能得到一张新的

57320

Kotlin上下文和异常处理

,SupervisorJob不会传播异常给它的父级,它会让子自己处理异常 或者SupervisorScope的子,一个失败,其他的子也不会受影响,但如果是作用域里面有异常失败,则所有子都会失败退出...异常的捕获 使用CoroutineExceptionHandler对异常进行捕获 时机:异常是被自动抛出异常抛出的(使用launch,而不是async时) 位置:CoroutineScope...的CoroutineContext或在一个根(CoroutineScope或者supervisorScope的直接子 handler要安装在外部,不能在内部,否则捕获不到异常...虽然不能阻止程序奔溃,全局异常处理器程序调试和异常上报等场景仍然有非常大的用处 我们需要在classpath下面创建META-INF/services目录,并在其中创建一个名为kontlinx.coroutines.CoroutineExceptionHandler...第一个异常之后发生的所有其他异常,都将被绑定到第一个异常之上。

5710
领券