7.2 异常处理

python基础编程之 7-2 python的异常处理机制 当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误 1. 异常处理 2. 断言(Assertions) 阅读详情

Q1:编译器的任务

• 支持异常处理,编译器的主要工作是找到 catch 子句,以处理被抛出的异常。需要支持以下几个工作:

• 追踪程序堆栈中每一个函数的目前作用区域(包括追踪函数中局部类对象当时的情况)

• 提供某种查询异常对象的方法,以知道其实际类型

• 管理被抛出对象的机制,包括其产生,存储以及析构



Q2:异常处理知识点回顾

• 当异常被抛出时,控制权将从函数调用中释放出来,并寻找一个吻合的 catch 子句。如果没有吻合的,则默认的 terminate() 会被调用。放弃控制权后,堆栈中的每一个函数调用也就被推离,推离前,函数的局部类对象的析构函数会被调用

• 异常在不同的位置抛出,将程序分为了不同的区域:

Eg:

        Point * mumble()
        {
            Point * pt1, * pt2;
            pt1 = foo();         //loc1
            if(!pt1)
                return 0;

            Point p;

            pt2 = foo();          //loc2
            if(!pt2)
                return pt1;

            …
        }

• 如果一个异常在第一次调用 foo() 时被抛出,则这个 mumble() 函数会被推出程序堆栈,由于此时的 foo()不在一个try 区段中,因此不需要尝试与 catch 子句吻合,也没有任何类对象需要析构。

• 如果一个异常在第二次调用foo() 时被抛出,则就必须在将这个函数从堆栈中推出前,先调用 P 的析构函数

因此,上述函数在异常处理下被分为两个语意(执行期语意)不同的区域。因此,编译器的做法有以下两种:

        1. 把两块区域以个别的“将被摧毁的局部对象”链表联合起来,该链表在编译器设置妥当

        2. 让两块区域共享同一个链表,该链表会在执行期放大或缩小


• 异常处理改变了函数在资源管理上的语意:

Eg:

        void mumble(void * area)
        {
            Point * p = new Point;
            smLock(area);              //上锁

            smUnLock(area);        //解锁
            delete p;
        }

• 异常处理机制此时将整个函数视为一个单一区域,不要担心将函数从程序堆栈中推出

• 从语意上而言,函数被推出之前,需要解锁共享内存,并delete p。支持异常处理的编译器为程序添加默认catch 子句,将程序转为如下:

        void mumble(void * area)
        {
            Point * p;
            p = new Point;

            try
            {
                smLock(area);
                //…
            }
            catch(…)
            {
                smUnLock(area);
                delete p;
                throw;    //解锁并释放 p 后,继续抛出原异常
            }

            smUnLock(area);
            delete p;
        }

将函数分为了两个区域:

        1. try块以外的区域,异常机制除了“pop”程序堆栈外,不做任何事情

        2. try块以内的区域(以及默认 catch 子句)

• 一个建议:将资源需求封装于一个类对象体内,并由析构函数来释放资源

• 支持异常处理,会使拥有类成员子对象或基类子对象的类的构造更复杂。一个类如果被部分构造,其析构函数必须只施行于哪些已经被构造的子对象或成员对象



Q3:对异常处理的支持

• 当异常发生时,编译系统必须完成的事情:

    1. 检验发生 throw 操作的函数

    2. 决定 throw 操作是否发生在 try 区段

    3. 若是,把异常类型拿出来与每一个 catch 子句进行比较

    4. 如果比较后吻合,将流程控制交到 catch

    5. 如果 throw 的发生不在 try 区段,或者没有一个 catch 与其吻合,则系统必须:

        i. 摧毁局部对象

        ii. 从堆栈中将当前函数推出

        iii. 进入程序堆栈中的下一个函数中,重复步骤 2~5

• 决定 throw 是否发生在一个 try 区段

• 编译器需要将一个函数分为以下几个区域:

        1. try 区段以外的区域,且没有 active 局部对象
        2. try 区段以外的区域,但有一个以上的 active 对象需要析构
        3. try 区段以内的区域

• 编译器需要标识这些区域,方法:构造出 program counter-range(程序计数器范围)表格。将try的位置在计数器中的起始位置与try区段的范围存储在该表格中。当 throw 操作发生时,比较目前程序计数器的值与表格中的值,即可判断目前作用域是否在 try 区段内

• 将异常的类型和每一个 catch 子句的类型作比较

• 对每一个抛出的异常,编译器产生一个类型描述器,对异常的类型进行编码。

• 编译器为每一个 catch 子句产生一个类型描述器

• 将抛出的异常的类型描述器与 catch 子句的类型描述器进行比较,直到找到吻合的或者直到堆栈已经被推出为空,调用 terminate

• 当一个实际对象在程序执行时被抛出,会发生什么事情?

• 注:只有在一个 catch 子句评估完毕且知道它不会再抛出异常之后,真正的异常对象才会被销毁

Eg:

            exVertex errVer;

            //…
            mumble()
            {
                //…
                if(mumble_cond)
                {
                    throw errVer;         //抛出全局对象
                }
            }

此时抛出的对象是全局对象的一个复制品,而全局对象没有被繁殖,意味着:在 catch 子句中对于异常对象的任何改变都是局部的,不会影响全局对象

• catch 局部对象与引用的区别:

Eg: 假设此时抛出的异常对象是 exVertex 类型

            //class exVertex : public exPoint{//…}

            catch(exPoint p)
            {
                //do something
                throw;
            }

此时,由于 p 是一个对象而不是引用,因此,其内容被拷贝构造的时候,将会截断异常对象的 non-exPoint 部分;当这个异常再一次抛出时,p 是局部对象,会在 catch 子句的末端被销毁,抛出 p 需要产生另一个临时对象,该对象将丧失原来的异常对象的 exVertex 部分,因此,将再次抛出原来的异常对象,该子句中对 p 的修改将被抛弃

Eg:

            catch(exPoint &p)
            {
                //do something
                throw;
            }

此时,由于 p 是一个引用,因此任何对此对象的改变都会被繁殖到下一个 catch 子句

手把手教你学GPU的KMD专栏--3.1 设备初始化流程深度解析 本文深入解析了KMD(内核模式驱动)设备初始化流程,这是GPU驱动开发最基础且关键的环节。初始化流程包括6个核心阶段:KMD模块加载、PCIe设备探测匹配、GPU硬件初始化、显存分配映射、中断系统配置和设备注册。每个阶段都有详细步骤解析,涉及关键数据结构和错误处理机制。文章还分析了常见问题(驱动加载失败、显存分配失败、中断配置失败)的解决方案,并指出未来趋势将向动态初始化、安全增强和AI优化方向发展。正确高效的初始化流程是确保GPU被操作系统安全使用的前提,也是后续内存管理、任务调度等功能的基础。 阅读详情

相关推荐

Halcon深度学习2 -- 标注工具Deep Learning Tool下载安装

Deep Learning Tool为Halcon开发公司MVTec官方提供的一款标注工具: 标记培训数据是任何深度学习应用程序的关键的第一步。 当涉及到应用程序的性能,准确性和健壮性时,此标记数据的质量起着重要作用。 借助MVTec深度学习工具,我们正在为HALCON用户创建全面流畅的深度学习体验。 通过开发我们自己的解决方案,我们确保可以将其输出无缝集成到HALCON中。 该应用程序还使我们能够吸收在开发HALCON深度学习算法时获得的丰富经验和专业知识,而该算法自然也涉及很多标签! Deep.

fengyingv的博客 1万+

Java异常原理剖析

本门课程深入讲解了Java异常机制的工作原理,代码结合理论的讲解方式,能够让你对Java的异常机制有更深刻的理解!通过本课程的学习让你能够轻松看懂异常信息!不再一头雾水!本门课程主要包括:异常概述、异常的继承体系、编译期异常Exception、运行时异常RuntimeException、异常的处理方案、自定义异常的实现、throw和throws关键字的用法、try...catch.finally异常处理讲解、及异常相关面试题的讲解。

彻底解决Win11 Android模拟器驱动权限问题:手动修改silent_install.bat的保姆级教程

本文提供了一份详细的Win11 Android模拟器驱动权限问题解决方案,重点介绍了手动修改silent_install.bat脚本的两种方法。通过分析问题根源并给出具体代码修改方案,帮助开发者彻底解决Android Studio在Windows 11上安装时遇到的UAC循环弹窗问题,确保android-emulator-hypervisor-driver顺利安装。

dengliugong3918的博客 461

深度探索c++对象模型之异常处理的前介

对于exception handling【异常处理】来说,编译器的主要工作是找出所有的catch子句,以处理被丢出来的exception。这就需要追踪程序堆栈中的每一个函数的当前作用域,包括追踪函数中的local class object当时的情况。在此同时,编译器还得提供某种查询exception object的方法,以知道它的真正类型,这就导致了执行器的RTTI【类型识别】。最后,还需要某种机

wenpinglaoyao的专栏 687

免费大容量国外网盘测评:冷数据归档与rclone加密接入

云存储的本质,是通过对象存储、冗余编码和分层缓存,把本地磁盘容量问题转化为网络访问与数据管理问题。免费大容量国外网盘常以空间换用户规模或付费转化,容量政策、传输策略、协议支持和退出成本,往往比标称容量更决定长期可用性。支持 WebDAV、S3 兼容和命令行工具的服务,可接入 rclone 等自动化流程,再配合客户端加密与冷热分层,用于冷数据归档、老项目备份和家庭影像保存。理解带宽换算、单文件上限、保活机制与传输一致性后,评估话题型大容量网盘与专业向协议网盘,就能把免费空间纳入可靠存储层。围绕免费大容量国外网

weixin_31292729的博客 213

EtherCAT主站教程3--适配伺服驱动器(模式配置)

目前通用的伺服驱动器的位置模式、速度模式以及其他模式是伺服系统中常见的控制模式,切换这些模式通常需要根据具体的伺服驱动器型号和控制协议(如EtherCAT、CANopen、Modbus等)进行配置。以下是这些模式的概述及切换方法的一般性指导:协议规范中,一共有以下几种模式:其中模式1、3、6对于比较常用,也更容易上手。

weixin_52626887的博客 793

常见的编译时异常和运行时异常

编译时异常:首先它的过程是在程序把他的.java的源文件编译成字节码文件也就是.class文件,出现的异常。 运行时异常:运行时异常表示虚拟机的通常操作中可能遇到的异常,它意味着程序存在着bug。 Exception分两类 :运行时异常,不需要强制处理 所有的RuntimeException的子类都是运行时异常编译时异常,需要强制处理 在Exception范围内,除了运行时异常的类都是编...

AlbenXie的博客 3300

GRSL 2026 即插即用 | Transformer篇 | DCSA:动态稀疏门控自注意力,兼顾长距离依赖与局部细节表达!

SDANet整体架构和模块Dynamic Channel Sparse Attention (DCSA):DCSA为Transformer块中的自注意力层。DCSA架构:样本级动态稀疏注意力:首次实现每个样本独立预测注意力稀疏度:通过轻量门控网络根据输入特征的复杂度自适应调整保留的通道数,简单样本使用更高稀疏度(如保留 20% 通道),复杂样本使用更低稀疏度(如保留 80% 通道),在保证精度的前提下平均计算量降低 50% 以上。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 108

Java实用方法整理(十四)——异常处理的几个常见方法 + 实例

1,方法描述 遇到异常,尤其是编译期间的异常,应该怎么处理呢?通常使用的方法有如下几种: (1)public String getMessage() :返回此throwable即该异常的详细消息字符串 (2)public String toString() :返回抛出异常的简短描述,结果是: 这个对象的类的name “:”(一个冒号和一个空格) 调用这个对象的getLocalizedM...

manduner的博客 903

15、运行语音识别应用:从Mac到微控制器的部署指南

本文详细介绍了如何在Mac上运行语音识别应用,并将其部署到Arduino Nano 33 BLE Sense和SparkFun Edge等微控制器设备上的完整流程。内容涵盖应用构建、设备特定的音频与输出实现、部署步骤、常见问题解决方案及进一步优化建议。通过本指南,开发者可快速实现基于TensorFlow Lite的嵌入式语音识别系统,并根据需求进行自定义修改与功能扩展。

l3m4n的博客 57

9.27华为OD机试真题 新系统 - 均衡调度 (Java/Py/C/C++/Js/Go)

9.26华为OD机试真题 新系统 - 均衡调度 (Java/Py/C/C++/Js/Go)

算法大师! 491

《深度探索C++对象模型》读书笔记第七章:站在对象模型的尖端

模板: 对于类来说,只有成员函数在被使用的时候,才会被具现出来。之所以如此,主要有两个原因: 空间和事件的考虑。可能只使用少数成员函数,不需要具现全部。尚未实现的机能。并不是一个 template 具现出来的所有类型一定能够完整支持一组成员函数所需要的运算符。如果只具现真正用到的成员函数,编译器就能够支持哪些对于其他成员函数可能造成编译错误的类型。(比如T t = 1024,t 或

FreeeLinux's blog 565

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

python2.7入门---异常处理

python2.7入门---异常处理

weixin_46246967的博客 77

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

假人有限元模型

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

2.2.7Python-异常处理

总目录:https://www.jianshu.com/p/e406a9bc93a9 Python - 子目录:https://www.jianshu.com/p/50b432cb9460 异常处理 什么是异常 在程序执行过程中发生,影响了程序的正常执行的时间。 异常是Python对象,表示一个...

寒暄的博客 405

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

2.7 Java之异常处理

异常处理 实例 运行时异常 异常处理 异常分RuntimeException和非RuntimeException,RuntimeException下有许多子类 实例 main方法内调用自身方法,则创建无数个args 每执行一次,则进行一次形参传递,分配无数多个空间,都为args 但栈空间有限,报异常 运行时异常 回顾bank类可能的空指针...

剑雨巍巍的博客 221

Python黑帽编程2.7 异常处理

异常是个很宽泛的概念,如果程序没有按预想的执行,都可以说是异常了。遇到一些特殊情况没处理会引发异常,比如读文件的时候文件不存在,网络连接超时。程序本身的错误也可以算作异常,比如把字符串当整数来处理,拼写错误。 不论是系统还是框架,都会对基本异常进行分类,比如IO异常,内存溢出等等。很多时候,针对特有的业务,我们也可以自定异常。

玄魂工作室 1367

OpenClaw异常处理机制:Qwen2.5-VL-7B任务失败自动重试配置

本文介绍了如何在星图GPU平台上自动化部署Qwen2.5-VL-7B-Instruct-GPTQ镜像,并配置OpenClaw异常处理机制实现任务失败自动重试。该方案特别适用于图片标注等长周期AI处理任务,通过超时控制、传输重试和降级策略保障任务稳定性,显著提升多模态模型在素材处理场景中的可靠性。

weixin_42452924的博客 369

ARMv7逆向工程入门:用GDB调试分析Thumb-2指令集与异常处理

本文为ARMv7逆向工程实战指南,详细介绍了如何使用GDB和QEMU搭建动态调试环境,深入分析Thumb-2指令集、处理器模式切换及异常处理机制。文章通过真实固件代码片段,演示了如何追踪程序执行流、观察寄存器变化,并探讨了CP15协处理器在系统控制与漏洞挖掘中的关键作用,旨在帮助安全研究人员掌握IoT设备底层分析与漏洞挖掘的核心技能。

lambda的博客 434

OpenClaw异常处理:Qwen2.5-VL-7B任务失败自动恢复机制

本文介绍了如何在星图GPU平台上自动化部署Qwen2.5-VL-7B-Instruct-GPTQ镜像,实现高效的多模态任务处理。该镜像支持自动恢复机制,特别适用于长时间运行的文档处理任务,如从PDF中提取表格数据并生成结构化报表,显著提升任务可靠性和执行效率。

weixin_36122351的博客 178

Python黑帽编程——2.7 异常处理

异常是个很宽泛的概念,如果程序没有按预想的执行,都可以说是异常了。遇到一些特殊情况没处理会引发异常,比如读文件的时候文件不存在,网络连接超时。程序本身的错误也可以算作异常,比如把字符串当整数来处理,拼写错误。不论是系统还是框架,都会对基本异常进行分类,比如IO异常,内存溢出等等。很多时候,针对特有的业务,我们也可以自定异常。下面我们先看一个引发异常的例子:Print 'hello'这个例子很简单,...

Fly_鹏程万里 385

软件构造 7-2 错误与异常处理

错误与异常处理 目录(机翻不要介意) 1.一般的错误与异常处理方法 2.java中的错误与异常处理   异常的分类   检查与不用检查异常   如何抛出异常   创建异常类   捕获异常   重新抛出和连接异常   最终的主句(finally)   Try-with-resources状态   分析栈轨迹元素   使用异常的建议 通常的错误与异常 此错误非java上的...

weixin_30407099的博客 215

【Laravel系列7.2】错误与异常处理

错误与异常处理在学习完 Laravel 中的日志处理模块之后,接下来马上就进入到错误和异常的学习中。其实通过之前 PHP 基础相关的学习,我们已经了解到 PHP7 中的大部分错误都已经可以通过异常来进行处理了,而我们的 Laravel 框架,基本全是通过异常来进行处理的。如果没有看过之前的文章或者视频,可以回去再看一下,链接在文章底部,因为关于错误和异常有三篇文章。产生错...

硬核项目经理 1781

【2.Delphi语法基础】7.程序异常处理

7.程序异常处理 Delphi对应用程序中产生的异常定义在SysUtils、DB、ComCtrl等多个库单元中。 7.1Object Pascal异常基类 Delphi中,所有异常的基类是Exception类。其主要属性和方法如下: 1.属性 HelpContext HelpContext是ThelpContext类的实例,提供了与异常对象联系在一起的上下文相关帮助信息的序列号。该序列号决定当发生异常时,用户按F1键显示的异常错误的帮助信息。 Message 存储异常发生时的

chenhaiy的博客 1345

2.7、Spring Boot 异常处理体系

本Spring Boot版本是2.2.2 1、流程 2、源码 public ConfigurableApplicationContext run(String... args) { ... Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>(); ... try { ... // 从spring.factories 文件中获取并创建所有 SpringBo

javaThinker的专栏 617

struts2 声明式异常处理(7)

声明式异常处理 声明抛出一个异常交给struts处理,并进行指定操作。 如: 在此处我们先抛出一个异常 然后在catch里写出throw语句 在***Action文件内,将此异常接收,发往struts.xml文件进行操作: 在struts.xml内,使用 exception-mapping接收异常并指定操作: 流程大概就是这样,理解最重要。 使用声明

属于Alex的Java小世界 279

7.2对输入数据的异常处理

import java.util.Scanner; public class ExceptionTest { void inputException(){ int a[]=new int[3]; //定义含有3个整型元素的数组a Scanner sc=new Scanner(System.in);//创建一个输入的对象 System.o

qq_40405945的博客 430
上一篇: 6.3 临时对象
下一篇: 7.3 执行期类型识别(Runtime Type Identification,RTTI)
Virtual_Func
博客等级 码龄11年 38粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值