OCC异常处理机制理解

1.目的

异常处理提供了一种将控制权从正在执行的程序中的给定点转移到与先前执行的另一点关联的异常处理程序的方法。在各种错误条件下引发异常,该异常会中断其正常执行并将控制权传递给捕获此异常的处理程序,以保护软件质量。OCC作为开源的几何算法库,它里面有一套完整的异常管理机制,通过观察其异常机制实现原理,发现其优缺点,为在其他CAD软件系统的错误处理方面提供帮助。

2.异常处理机制

OCC实现了异常类的层次结构。根类为Standard_Failure,其它异常类直接或间接继承该根类。Standard_Failure类只有一个属性myMessage,它用来记录异常信息,其子异常类可以在其基础上扩展。

在应用程序的正常执行期间,不应引发任何异常,可能引发异常的方法应受其他方法的保护,但又不能影响正常使用的效率,所以一般会在程序的调试版本中包含保护并在发布版本中排除保护。OCC为了支持这种做法为每个异常类提供了一个带_Raise_if()的宏函数,如下所示:

CONDITION是条件,导致引发异常的逻辑表达式,MESSAGE是错误消息。通过在编译时定义预处理符号之一No_Exception或No_ErrorTypeName可以删除整个调用。下图代码为其使用案例:

OCC使用C++ throw抛出异常,通过try…catch捕捉处理异常,如下图所示:

异常捕捉机制按出现顺序处理程序,从最接近try块到最远的处理程序,直到与catch里面的表达式匹配。对于try块,将基本异常类型的处理程序放在其派生类型的处理程序之前是错误的,因为这将确保永远不会调用派生异常的处理程序。OCC的异常形成一个与其他用户定义的类完全分离的层次结构树。Standard_Failure作为整个异常层次结构的根,因此,使用具有Standard_Failure类型的处理程序可以捕获任何OCC的异常,一般建议在主例程中设置此类处理程序。

OCC异常处理为了使用程序以其它异常相同的形式捕获系统信号(访问违规,除零等),需要通过OSD::SetSignal()方法在运行时安装适当的信号处理程序。通常在main()函数开头调用。它安装一个处理程序,将系统信号转换为OCC异常。为了支持在不同平台上实现这种处理,OCC定义了一个OCC_CATCH_SIGNALS的宏,实际使用中需要把该宏放置在try{}块的开头。OCC_CATCH_SIGNALS宏定义如下:

如上所示,在Windows下,默认情况该宏是一个空宏,所有情况下都使用普通C++异常,包括从信号处理程序抛出。在Linux下,默认情况下定义该宏,由于Linux不可能从系统信号处理函数抛出C++异常(应该是Linux信号是C形式的),因此该函数会跳到最近宏OCC_CATCH_SIGNALS调用,并且只有在那里才会实际抛出C++异常。

3.总结及建议

OCC

错误处理机制

Try…catch异常机制

实现方式

以Standard_Failure为根类设计异常层次结构,并将系统信号转为异常统一处理

使用情况

比较统一,使用比较规范

效率影响

大量使用异常处理,影响效率

跨平台特性

多平台

错误信息

输出错误信息更全面

异常机制可以捕捉一些错误码无法处理的错误信息,但会影响效率。OCC主要通过这种异常机制来做错误处理,它定义了一套完整的异常结构层次,并把系统信号转为异常统一处理,形成自己的错误处理规范,为此便利了操作,但效率还有待提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/727333.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW程序退出后线程仍在运行问题

LabVIEW程序退出后,线程仍在运行的问题可能源于资源管理不当、未正确终止循环、事件结构未处理、并发编程错误以及外部库调用未结束等方面。本文将从这些角度详细分析,探讨可能的原因和解决方案,并提供预防措施,帮助开发者避免类似…

昇思25天学习打卡营第2天|张量Tensor

一、张量的定义: 张量是一种特殊的数据结构,与数组和矩阵非常相似。张量(Tensor)是MindSpore网络运算中的基本数据结构(也是所有深度学习模型的基础数据结构),下面将主要介绍张量和稀疏张量的属…

重学java 79.JDK新特性 ⑤ JDK8之后的新特性

别怕失败,大不了重头再来 —— 24.6.20 一、接口的私有方法 Java8版本接口增加了两类成员: 公共的默认方法 公共的静态方法 Java9版本接口又新增了一类成员: 私有的方法 为什么IDK1.9要允许接口定义私有方法呢? 因为我们说接口是规范,规范是…

NetSuite Inventory Transfer Export Saved Search

用户之前有提出一个实际的需求,大致意思是想要导出Inventory Transfer的相关明细行信息,且要包含From Location,To Location,Quantity等信息。 我们知道From Location和To Location在IT Form中应该是在Main的部分,在D…

办公技能——如何写好会议纪要,提升职业素养

一、什么是会议纪要 会议纪要是一种记载、反映会议情况和议定事项的纪实性公文,是贯彻落实会议精神、指导工作、解决问题、交流经验的重要工具。 会议纪要可以多向行文:向上级机关汇报会议情况,以便得到上级机关对工作的指导;向同…

Element-UI实现el-dialog弹框拖拽功能

在实际开发中,会发现有些系统,弹框是可以在浏览器的可见区域自由拖拽的,这极大方便用户的操作。但在查看Element-UI中弹框(el-dialog)组件的文档时,发现并未实现这一功能。不过也无须担心,vue中…

【Linux从入门到放弃】进程地址空间

🧑‍💻作者: 情话0.0 📝专栏:《Linux从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢! 进…

网络安全管理组织架构复习

文章目录 安全管理机构岗位设置安全要求要求解读 安全管理机构 安全管理的重要实施条件就是有一个统一指挥、协调有序、组织有力的安全管理机构,这是网络安全管理得以实施、推广的基础。 通过构建从单位最高管理层到执行层及具体业务运营层的组织体系,可以明确各个…

示例:WPF中DataGrid设置多级分组样式

一、目的&#xff1a;应用CollectionViewSource和GroupStyle设置DataGrid多级分组样式 二、实现 一级分组效果如下 二级分组效果如下 三、环境 VS2022 四、示例 具体实现代码如下 <TabItem Header"DataGrid - 多级分组"><TabItem.Resources><Colle…

最新源支付系统源码 V7版全开源 免授权 附搭建教程

简介&#xff1a; 最新源支付系统源码_V7版全开源_免授权_附详细搭建教程_站长亲测 YPay是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。它采用全新轻量化的界面UI&#xff0c;让您能更方便快捷地解决知识付费和运营赞助的难题。同时&#xff0c;…

thread model线程模型

Concurrency并发 vs. Parallelism执行 Many-to-One GNU Portable Threads 多对一即多个用户线程映射到单个内核线程 该模式用的少 一个线程阻塞会导致所有线程阻塞 多线程可能无法在多核系统上并行运行&#xff0c;因为同一时间内核中可能只有一个线程 Concurrent executio…

看热点新闻从中获取的客观信息有哪些?

提取热点新闻的客观价值&#xff1b; 避免主观情绪的投射代入。 参考网址&#xff1a; https://damo.alibaba.com/alibaba-global-mathematics-competition?langzh&languagezhhttps://damo.alibaba.com/events/32024060617176459249878092?languagezh 这份名单&#x…

【ARMv8/v9 GIC 系列 3 -- GIC 的 类型寄存器 GICD_TYPER】

文章目录 GIC 类型寄存器 GICD_TYPERESPI_Range, 位[31:27]RSS, 位[26]No1N, 位[25]A3V, 位[24]IDBits, 位[23:19]DVIS, 位[18]LPIs, 位[17]MBIS, 位[16]NUM_LPIs, 位[15:11]SecurityExtn, 位[10]NMI, 位[9]ESPI, 位[8]CPUNumber, 位[7:5]ITLinesNumber, 位[4:0]GIC 类型寄存器…

无线串口模块有什么优势特点及串口参数设置

无线串口是一种无线通信技术&#xff0c;它允许原本通过有线连接&#xff08;如RS232、RS485等标准串行接口&#xff09;的设备之间通过无线方式进行数据传输。无线串口模块通常包括发射端和接收端两部分&#xff0c;发射端将串口数据转换为无线信号并发射出去&#xff0c;接收…

动态规划——达拉崩吧

1、题目链接 174. 地下城游戏 2、题目分析 假如说我们正向推状态转移方程&#xff0c;很难推出来&#xff0c;因为这道题有“加血”的说法&#xff0c;只能依靠后面的值判断前面所需要的血量&#xff0c;也就是说&#xff0c;如果正向的dp表示从起点出发&#xff0c;到达&…

【ajax基础05】利用ajax渲染数据思路总结

目录 一&#xff1a;利用字符串渲染 二&#xff1a;获取标签进行数据渲染 1 前置知识点 2 从服务器获取数据为对象 核心思想&#xff1a; 关键&#xff1a; 进行数据渲染&#xff0c;无非就两个步骤1 从服务器获取到数据2 将数据渲染到html结构当中 因此不同的渲染思路…

119.网络游戏逆向分析与漏洞攻防-邮件系统数据分析-邮件读取与删除功能的封装

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

vivado TILE

TILE是包含一个或多个SITE对象的设备对象。可编程逻辑TILE 包括各种各样的对象&#xff0c;如SLICE/CLB、BRAM、DSP、I/O块、时钟资源&#xff0c;以及 GT块。从结构上讲&#xff0c;每个瓦片都有许多输入和输出&#xff0c;并且可编程 互连以将瓦片的输入和输出连接到任何其他…

她经济和女性经济,女性消费力量的崛起

在当今这个数字化飞速发展的时代&#xff0c;"她经济"已经不再是一个简单的概念&#xff0c;而是一场正在上演的女性消费革命。 在最新的《QuestMobile 2024“她经济”洞察》报告中&#xff0c;为我们揭示了女性在移动互联网时代的独特地位和影响力。 首先&#xf…

LeetCode 1164, 125, 94

目录 1164. 指定日期的产品价格题目链接表要求知识点思路代码 125. 验证回文串题目链接标签简单版思路代码 复杂版思路代码 94. 二叉树的中序遍历题目链接标签递归思路代码 迭代思路代码 1164. 指定日期的产品价格 题目链接 1164. 指定日期的产品价格 表 表Products的字段为…