关于coroutine的异常捕获和取消机制

educoder 5-3Python 计算思维训练——地图模拟 任务描述 本关任务:利用 Python 实现动画观察近 30 天 4.5 级以上地震发生情况。 相关知识 为了完成本关任务,你需要掌握:1.如何用 Python 从网络获取所需数据;2.如何用 Python 绘制地图 从网络获取数据 URL 处理模块(库) 在这里插入代码片 import urllib.request as req 创建一个表示远程 url 的类文件对象 urllib.urlopen(" ") 如同本地文件一样读取内容 print data的输出结果: 摘取动画所需数据 阅读详情

https://www.youtube.com/watch?v=VWlwkqmTLHc&list=PLQkwcJG4YTCQcFEPuYGuv54nYai_lwil_&index=11

协程总结

抓不到的异常

如果我们在launch外面try catch 意图捕获异常的话

   //无法捕获异常导致奔溃
    private fun cannotCatchException() {
        lifecycleScope.launch {
            try {
                //外面catch不到的
                launch {
                    //只能在这里面try catch,直接捕获
                    throw Exception()
                }

            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }

如果不是在抛出异常的地方直接捕获异常,那么在外面是捕获不到的,会直接导致应用奔溃

asyn不会奔溃

如果async中发生了异常,如果没有调用await,则程序不会奔溃

 private fun asyncWonCrash() {
        lifecycleScope.async {
            val string = async {
                delay(1000)
                throw Exception("error")
            }
        }
    }

我们在async中直接抛出异常,但是应用没有奔溃

但如果在launch中运行,需要再await的地方添加捕获,不然程序奔溃

  private fun asyncWonCrash() {
        val result = lifecycleScope.async {
            val string = async {
                delay(1000)
                throw Exception("error")
                "result"
            }
            println("linlian"+string.await())
        }

        lifecycleScope.launch {
            try {
                result.await()
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }

当时如果只是看到这里,以为就结束了!!!!

no,上面的这个异常捕获,有一个很大的陷阱,之前的文章也有提到

就是我们可能吧 cancellation exception也捕获了,导致协程任务无法取消!!!!

那一般是怎么处理了,可以根coroutinescope添加coroutineexception handler

    private val exceptionHander = CoroutineExceptionHandler { ctx, throwale ->

        println("handle exception $throwale")
    }

    private fun exceptionHandlerdemo() {
        lifecycleScope.launch(exceptionHander) {
            launch {
                throw Exception("error")
            }
        }
    }

这样内部子任务的异常都可以被捕获

协程的某个子任务异常了,那其他的任务会怎样呢?

那这个和所在的scope的类型有关,如果是个普通的sceop

当有一个子协程异常了,其他的协程也取消了

 private fun differentScope() {
        CoroutineScope(Dispatchers.Main).launch(exceptionHander) {
            launch {
                delay(300)
                throw Exception("linlian 1 failed")
            }
            launch {
                delay(500)
                println("linlian 2 success")
            }

        }
    }

但是像viewmodescope这些,还有globalscope,一般我们一个子协程异常,是不会影响到其他的协程的,这个是什么原因呢

viewmodel的源码中

val ViewModel.viewModelScope: CoroutineScope
        get() {
            val scope: CoroutineScope? = this.getTag(JOB_KEY)
            if (scope != null) {
                return scope
            }
            return setTagIfAbsent(JOB_KEY,
                CloseableCoroutineScope(SupervisorJob() + Dispatchers.Main.immediate))
        }
SupervisorJob()

Creates a supervisor job object in an active state. Children of a supervisor job can fail independently of each other.

互不影响


    private fun differentScope() {
        CoroutineScope( Dispatchers.Main).launch(exceptionHander) {
            supervisorScope {
                launch {
                    delay(300)
                    throw Exception("linlian 1 failed")
                }
                launch {
                    delay(500)
                    println("linlian 2 success")
                }

            }
            
        }
    }

所以加上 supervisorScope ,任务2就不会因为任务1的异常而被影响,取消了。

另外如果cancellation exception被捕获的话,任务也不会取消,会一直运行下去

第110章 PCL PointCloudFusing 点云融合重建详细讲解 点云融合是指将多个不同视角、不同位置、不同传感器获取的点云数据进行合并,得到一个更加完整、准确的三维模型。多视角扫描:从多个相机或传感器获取点云数据,需要将这些数据融合成一个统一的三维模型。传感器融合:例如将激光雷达(LiDAR)点云与相机的图像数据融合,以便获得更高质量的三维重建。动态场景重建:动态环境中的物体,点云数据不断更新,如何平滑地融合这些点云是一个重要课题。点云融合的目标是将不同来源的点云数据准确地合并,消除冗余,减少噪声,并提高整体的点云密度和精度。 阅读详情

相关推荐

别再只插线了!用示波器‘偷看’USB-C PD协议握手全过程(附BMC/4B5B编码解析)

本文详细介绍了如何使用示波器捕获并解码USB-C PD协议的握手过程,包括BMC/4B5B编码的解析技巧。从硬件配置到波形分析,再到协议注入,为工程师提供了一套完整的实战解码手册,帮助深入理解PD协议的工作原理。

weixin_42526417的博客 404

协程的启动和取消

1、协程构建器 launch与async构建器都用来启动新协程 launch,返回一个Job并且不附带任何结果值 async,返回一个Deferred,Deferred也是一个Job,可以使用await()在一个延期的值上得到它的最终结果 等待一个作业 launch通过join async通过await 2、协程的启动模式 DEFAULT:协程创建后,立即开始调度,在调度前如果协程被取消,其将直接进入取消响应的状态 ATOMIC:协程创建后,立即开始调度,协程执行到第一个挂起点之前

nicolelili1的专栏 989

记录思科cisco交换机升级iso步骤

Cisco Nexus 93180交换机版本升级

a635161812的博客 4378

协程的取消和异常Part3-异常

我们作为开发者,在开发app时,如果程序的运行没有按预期执行时,应适当地给用户提示。一方面,看到应用程序崩溃对用户来说是一种糟糕的体验;另一方面,当操作没有成功时,向用户显示正确的信息是必不可少的。

潇风寒月 1047

RS485接口EMC设计:三级防护与滤波隔离方案

RS485总线在工业现场面临共模噪声、差模脉冲和地电位差三大电磁兼容挑战。通过三级防护架构(气体放电管、PTC热敏电阻、半导体放电管)实现能量梯次泄放,结合共模扼流圈和滤波电容形成完整防护链。该方案经实测可将6kV浪涌下的通信稳定性提升90%,特别适用于工业自动化、电力监控等严苛环境。设计要点包括防护器件选型计算、PCB分区布局及地处理策略,其中GDT通流能力与TSS箝位电压的配合是关键。

weixin_33419305的博客 525

SAP 中租赁资产的实现需区分经营租赁与融资租赁,核心围绕资产主数据配置、折旧与利息设置、科目分配及业务操作展开

摘要:SAP系统租赁资产管理需区分经营租赁与融资租赁,通过SPRO配置资产主数据、折旧范围、利息计算及科目分配。关键步骤包括:激活折旧范围利息计算(OABZ)、设置租赁资产类别(OAYZ)、维护总账科目(AO90)及创建租赁资产主数据(AS01)。业务操作涵盖资产资本化(ABZON)、折旧利息过账(AFAB)、租金支付(F-53)及终止处理(ABUMN)。核心配置要点在于准确设置租赁类型、利率参数和科目联动,确保系统自动计算折旧与利息并生成正确凭证。

金牌架构师 1076

Kotlin协程CoroutineScope异步async取消cancel等待await的任务

一般编程的技法,比如,在Android中,假设在主线程中实现了一个函数,但该函数是耗时操作,毫无疑问,需要将这个函数的实现切入非主线程中操作,那么可以设计一种托管的函数,在托管的函数里面干脏活,处理完成后,把结果抛到主线程。结果1-a: 5 - tid:22。_kotlin协程 串行。一般编程的技法,比如,在Android中,假设在主线程中实现了一个函数,但该函数是耗时操作,毫无疑问,需要将这个函数的实现切入非主线程中操作,那么可以设计一种托管的函数,在托管的函数里面干脏活,处理完成后,把结果抛到主线程。

Zhang Phil 826

YOLOv8进阶:SEAM注意力与Repulsion Loss双剑合璧,突破遮挡检测瓶颈

做目标检测时,最头疼的莫过于目标被遮挡的场景——行人被树木挡住一半、车辆被广告牌遮挡部分轮廓……这些情况往往让模型“犯迷糊”。但现在,有了SEAM注意力模块和Repulsion Loss排斥损失,我们就能让YOLOv8在遮挡场景下也能“拨开迷雾见真章”。这篇教程会带你一步步理解这两个技术,并亲手把它们融入YOLOv8,让你的检测模型在复杂场景下也能稳如泰山。

FJN110的博客 233

LifecycleScope

android

weixin_50386489的博客 2643

OSError We couldn‘t connect to https://huggingface.co to load file, couldn‘t find it chatglm3-6b解决方案

本文主要介绍了OSError: We couldn’t connect to https://huggingface.co to load this file, couldn’t find it in the cached files and it looks like THUDM/chatglm3-6b is not the path to a directory containing a file named config.json.解决方案,希望能对学习python的同学们有所帮助。

weixin_43178406的博客 5万+

#systemverilog# 之 event region 和 timeslot 仿真调度(二)例子

由于疫情的关系,一时半会回不了学校了。今天开始,哪怕在家也要克服惰性开始学习了。今天来个的想了很久但都犯懒而没动手的内容,就是关于仿真软件在跑systemverilog的时候,是如果通过将HDL代码分成5个区域来编译,从而实现用软件模拟硬件的运行结果的思想。 首先,是基础概念,systemverilog标准划分了仿真软件的5个跑仿真所要执行的区域,说白了就是规定了软件在跑代码的时候要把代码分成5类,放到5个堆栈里面分别跑,这样才能:明明在软件上是以顺序方式来执行代码的,却能“看似”像在硬件中那样的实现并行

那么菜的博客 1765

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

一、协程异常处理器 CoroutineExceptionHandler 捕获异常 1、对比 launch 和 async 创建的协程的异常捕捉示例 2、验证 CoroutineScope 协程的异常捕捉示例

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2677

【打卡帖】7日玩转ESP32——(第4日) 串口的输入输出

【福利帖】7日玩转ESP32——(第4日) 串口的输入输出

1377

kotlin coroutine源码解析之Job取消以及异常的处理流程分析

异常的传导链,从子Job向父Job传导:如果父Job是supervisorJob的话,将不做处理,需要子Job自己处理;如果父Job是JobSupport的话,异常还会继续向父Job的父Job传递,直到根部Job。所以捕获异常的话在根ScopeCoroutine里面设置就比较合适,对于有supervisorJob的情况,需要在supervisorJob的子Job中设置异常处理器,supervisorJob自己不会处理异常。

u012345683的博客 2139

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

kotlin coroutine文档:取消和超时

取消和超时 这部分讲述协程的取消和超时 取消协程的执行 在一个长期运行的应用,你可能需要细粒度地控制后台协程。例如,一个用户可能关闭页面,这个页面启动了一个协程,它的结果现在不再需要了,它的运行应该要取消。launch函数返回一个Job,它可以用来取消运行的协程: import kotlinx.coroutines.* fun main() = runBlocking { //例子开始 ...

tigershin的专栏 2063

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Android中用Kotlin Coroutine(协程)和Retrofit进行网络请求和取消请求

Kotlin Coroutine(协程)系列: 1. Kotlin Coroutine(协程) 简介 2. Kotlin Coroutine(协程) 基本知识 前面两篇文章介绍了协程的一些基本概念和基本知识,这篇则介绍在Android中如何使用协程配合Retrofit发起网络请求,同时介绍在使用协程时如何优雅的取消已经发起的网络请求。 此篇文章的Demo地址:https://github.com/...

老胡 7490

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

协程的取消和异常Part2-取消

在不需要协程继续工作时,需要及时地取消它,以免浪费内存和电量。本篇文章将带你了解协程取消的来龙去脉。

潇风寒月 960

Kotlin Coroutine 异步编程框架

Kotlin Coroutine 异步编程框架,主要特点及使用示例。

zsy_2020的博客 948

MicroPython-async 异常处理:全局异常处理器与任务取消

在嵌入式系统开发中,异常处理和任务管理是确保程序稳定性的关键环节。MicroPython-async 作为一个专注于硬件接口异步操作的库,提供了强大的异常处理机制和灵活的任务管理功能。本文将详细介绍如何在 MicroPython-async 项目中实现全局异常处理和任务取消,帮助开发者构建更健壮的嵌入式应用。 ## 为什么需要全局异常处理? 在异步编程中,任务可能在不同的上下文中执行,单个任务

gitblog_00587的博客 1111

ASNYCIO 中task,coroutine和future

COROUTINE Coroutine 利用async def(py3.5)去定以,或者使用生成器进行定义。 Coroutine,跟生成器差不多,用于两种不同但是相关的概念: 1:用于定义coroutine的coroutine函数,使用iscoroutinefunction()来查看是否为coroutine类型的函数 2:coroutine,被coroutine类型函数调用的对象,用于能

weixin_36851634的博客 1286

kotlinx.coroutines 协程异常处理与取消机制完全指南:从传播规则到监督作用域

本文以 kotlinx.coroutines 官方指南 [exception-handling](https://link.gitcode.com/i/777eac516435614170e18741a04cf146) 为骨架,系统讲解协程中"异常如何传播、何时被视为未捕获异常、取消与异常如何交织、以及如何用 SupervisorJob/supervisorScope 实现单向失败传播"。读完你将

gitblog_01109的博客 225

Coroutines : First things first 协程取消和异常

这是关于的一系列文章,写的很不错。一直准备翻译来着,种种原因给耽误了,一直拖到现在。原文作者:manuelvicnt原文地址:Coroutines: First things first译者:秉心说该系列博客深入探索了协程的取消和异常。可以避免进行预期以外的工作,从而节省内存和电量;可以带来良好的用户体验。作为该系列另外两篇文章的基础,通过本文搞清楚协程的一些基本概念,例如Job等,是非常重要的。

chuyouyinghe的专栏 135

[译] Kotlin 协程异常处理

原文:https://github.com/Kotlin/kotlinx.coroutines/blob/master/docs/topics/exception-handling.md 文章目录异常传播协程异常处理器 CoroutineExceptionHandler 本节介绍异常处理和在异常时取消。我们已经知道取消的协程会在挂起点抛出 CancellationException 并且它会被协程的机制忽略。这里我们看看如果在取消过程中抛出异常或者同一个协程的多个子协程抛出异常会发生什么。 异常传播 协程构

hegan2010的博客 1479

Retrofit整合RxJava与Coroutine的源码级原理与避坑指南

Retrofit作为Android主流网络库,其原生Call<T>仅负责HTTP协议绑定,不处理异步调度、生命周期绑定、错误统一收敛和请求编排等关键问题。RxJava通过Observable数据流与操作符链提供声明式响应式能力,Coroutine则以挂起函数重构调用模型,实现线程透明与结构化并发。二者本质都是对Retrofit执行契约的升级:从被动回调转向主动控制。技术价值体现在可预测性增强、测试友好性提升、UI层解耦深化。典型应用场景包括搜索防抖取消、多接口并行聚合、长链路数据加工等。本文深入CallAd

weixin_34200628的博客 235

为什么你的协程内存不断增长?深入剖析coroutine_handle未销毁根源

掌握协程内存泄漏的根源与解决之道,深入解析coroutine_handle的销毁机制。适用于C++20协程开发场景,揭示未正确释放导致内存增长的关键问题,提供可靠析构方案。有效提升程序稳定性与性能,值得收藏。

CompiGap的博客 306

kotlin coroutine withContext

kotlin coroutine withContext

ttlan的博客 1721
上一篇: Room 引用复杂数据
下一篇: 微信消息语音播报秒实现
lynn8570_blog
博客等级 码龄10年 254粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值