其他分享
首页 > 其他分享> > IEEE754-2008 标准详解(六):异常处理

IEEE754-2008 标准详解(六):异常处理

作者:互联网

IEEE754-2008 标准详解(六):异常处理


本文为原创文章,转载请注明出处,并注明转载自“黄邦勇帅(原名:黄勇)”
本文是对《C++语法详解》一书相关章节的增补,以增强读者对浮点数的理解,《C++语法详解》网盘地址:https://pan.baidu.com/s/1dIxLMN5b91zpJN2sZv1MNg

有兴趣的读者可参阅本人所著《C++语法详解》一书,电子工业出版社出版,该书语法示例短小精悍,对查阅C++知识点相当方便,并对语法原理进行了透彻、深入详细的讲解,可确保读者彻底弄懂C++的原理,彻底解惑C++,使其知其然更知其所以然。此书是一本全面了解C++不可多得的案头必备图书。



6.1 基本概念及基本规则


需要弄清楚异常、异常处理、异常处理属性三者的关系,以及处理异常的各种方式。

6.1.1 异常与异常处理

1、异常

2、异常处理

3、对“处理”一词的说明
“处理”即可作为名词,也可作为动词。若把“异常处理”中的处理理解为名词,则可将其理解为“异常处理函数或异常处理程序块”的简称,若理解为动词,则意思是“对异常进行处理”。读者应根据上下文进行区分,本文尽量避免这种产生混淆的用法,其他的形式如,
异常处理方式 = 处理异常的方式
进行异常处理 = 对异常进行处理

6.1.2 处理异常的方式

1、有多种异常处理的方式,如,默认处理、即时处理、延迟处理、即时转移控制、延迟转移控制、可恢复模式、不可恢复模式等。这些异常处理的方式在IEEE754中都使用相应的属性来描述。

2、可恢复模式与不可恢复模式

3、即时处理与延迟处理

4、转移控制
转移控制是指的把异常处理转移(throw)到本地之外的其他地方处理异常,或者直接跳过(break或goto)而不处理异常。若异常被转移到其他地方处理,则该异常是怎样被处理的,并不能确定,即,可能已被处理,也可能未被处理,可能继续使用备用异常处理或默认异常处理,也可能不是。

5、默认处理
按IEEE754标准所述,默认异常处理的方式很简单,就是返回一个默认结果,设置一下状态标志,然后就可以继续执行了,这里返回的结果可以简单的理解为向用户返回一个错误代码或输出一串说明性文字,当然也可能什么都不做,可见,这种处理方式是属于可恢复模式和即时处理方式。理论上而言,异常的默认处理方式应该由系统完成(如用户使用的编译器)

6、备用异常处理

7、属性、异常处理属性

8、目前IEEE规定了以下几类异常处理方式:

9、本文的名称约定
对于所有的异常处理方式,本文有时会省略异常或备用二字,如

6.1.3 IEEE754有关异常处理的基本规则

1、下文的语言标准或语言定义,是指的类似于C++、java等之类的程序语言的标准,如C++11、C++14等就是C++的语言标准。

2、实现,是指的按语言标准做出来的软件(app),通常是指编译器,如Visual Studio C++等,就是C++语言标准的实现。

3、有关属性与异常处理的规则

4、各种异常处理的具体处理方式


6.2 理清IEEE754的异常处理


6.2.1 基本程序结构约定

本文使用类似编程语言的语法来讲解IEEE754的异常处理,因此,作如下基本规定

6.2.2 属性命名约定

1、为什么要命名

IEEE754并未对所有的异常类型、异常处理方式、属性指定标准的名称,也就是说,这些名称需要由实现或语言标准来定义,因此,我们也可以自行对其命名。

2、为方便讲解,本文自行命名如下名称:

3、本文不对属性和属性值作一严格区分,一个属性即可作为属性使用,也可作为属性值使用,如,备用异常处理属性ExHAttr可取值之一为ResExHAttr 属性(恢复备用异常处理属性),而ResExHAttr属性又可取值default、raiseNoFlag等。

6.2.3 IEEE754异常处理的基本规则的设计

1、注:以下的“本文规定”是指的需要由语言标准去规定,或需要由实现(如编译器)去完成的任务,本文不需关心“本文规定”的内容是如何做到或完成的,因为那不是本文重点,那是诸如编译器的事,本文只负责设计一个基本的流程,以讲清楚IEEE754的异常处理规则。

2、本文假设程序从f()函数开始执行。

3、本文使用try块以表明该程序块会产生异常。

4、本文使用setExAttr()函数,该函数可完成IEEE754的以下规则

5、xxx()函数

6、本文使用函数y作为备用异常处理函数,z作为默认异常处理函数。

7、根据规则8,在y和z中的一系列if语句就是一个异常列表(示例只包含了部分列表)。该列表其实可以视情况只列出需要处理的异常,而不需要完全列出来

8、根据规则9,if语句后的程序块就是处理异常的动作。

9、setFlag()函数用于设置异常的状态标志。

10、理清哪些程序块的代码是由系统(如编译器)完成的,哪些需要由用户自已编写完成

11、通过以上规定,再根据IEEE754对异常处理的具体方式,我们可以列出一个如下所示的IEEE754处理异常的程序结构,IEEE的异常处理流程是很简单的,如下图XXX所示

12、IEEE754处理异常的程序结构如下所示

在这里插入图片描述
13、下图为IEEE754即时、延迟备用异常处理和默认异常处理的程序执行流程

在这里插入图片描述

14、转移控制是指的把异常处理转移到本地之外的其他地方处理异常(throw),或者直接跳过(break或goto),其程序执行流程如以下两图所示

在这里插入图片描述

6.2.4 异常处理现实示例

1、为便于理解异常处理的具体规则,现在以现实中的示例来帮助理解异常处理的各种情形,以及其作用、逻辑、适用情况。

2、某公司正在进行有多个任务的大型工程研究,员工A突然生病了(产生异常),需要送到医院(异常处理程序),并进行医治(处理异常),于是向上级B汇报(发送异常),以上情况与异常的关系类似于

生病 = 异常
医院 = 异常处理函数或异常处理程序
医治 = 处理异常
向上级汇报 = 发送异常

现有以下几种方式处理员工A的异常情况


有关IEEE754其他剩余章节的内容


IEEE754还讲解了以下内容,本文不作讲解,这些内容几乎都是对实现的要求或一些补充的要求

1、推荐的运算:主要定义了一些额外的推荐的不是必须要求的运算函数,如指数运算函数、三角函数、∑求和运算函数、∏运算函数等

2、表达式求值规则:主要是表达式的运算规则,如赋值时的舍入问题、求值顺序等,这些规则与程序设计语言中的规则是类似的,且应由实现(如编译器)来完成,所以意义不大,本文不对其讲解。

3、Reproducible (可再生的、可复制的)浮点结果。


作者:黄邦勇帅(原名:黄勇)

2021-11-29

在这里插入图片描述


标签:处理,IEEE754,默认,详解,2008,属性,异常,备用
来源: https://blog.csdn.net/hyongilfmmm/article/details/121620202