族谱网 头条 人物百科

异常处理

2020-10-16
出处:族谱网
作者:阿族小谱
浏览:418
转发:0
评论:0
异常安全一段代码是异常安全的,如果这段代码运行时的失败不会产生有害后果,如内存泄露、存储数据混淆、或无效的输出。异常安全可分成不同层次:失败透明(failuretransparency),也称作不抛出保证(nothrowguarantee):代码的运行保证能成功并满足所有的约束条件,即使存在异常情况。如果出现了异常,将不会对外进一步抛出该异常。(异常安全的最好的层次)提交或卷回的语义(commitorrollbacksemantics),或称作强异常安全(strongexceptionsafety)或无变化保证(no-changeguarantee):运行可以是失败,但失败的运行保证不会有负效应,因此所有涉及的数据都保持代码运行前的初始值。基本异常安全(basicexceptionsafety):失败运行的已执行的操作可能引起了副作用,但会保证状态不变。所有存储数据保持有效值,即使这些数据...

异常安全

一段代码是 异常安全的 ,如果这段代码运行时的失败不会产生有害后果,如内存泄露、存储数据混淆、或无效的输出。异常安全可分成不同层次:

失败透明(failure transparency) ,也称作 不抛出保证(no throw guarantee) :代码的运行保证能成功并满足所有的约束条件,即使存在异常情况。如果出现了异常,将不会对外进一步抛出该异常。(异常安全的最好的层次)

提交或卷回的语义(commit or rollback semantics) ,或称作 强异常安全(strong exception safety) 或 无变化保证(no-change guarantee) :运行可以是失败,但失败的运行保证不会有负效应,因此所有涉及的数据都保持代码运行前的初始值。

基本异常安全(basic exception safety) :失败运行的已执行的操作可能引起了副作用,但会保证状态不变。所有存储数据保持有效值,即使这些数据与异常发生前的值有所不同。

最小异常安全(minimal exception safety) 也称作 无泄漏保证(no-leak guarantee) :失败运行的已执行的操作可能在存储数据中保存了无效的值,但不会引起崩溃,资源不会泄漏。

异常不安全(no exception safety) :没有保证(最差的异常安全层次)。

例如,考虑一个smart vector类型,如C++"s std::vector 或Java"s ArrayList 。当一个数据项 x 插入vector v ,必须实际增加 x 的值到vector的内部对象列表中并且修改vector的计数域以正确表示 v 中保存了多少数据项;此时如果已有的存储空间不够大,就需要分配新的内存。内存分配可能会失败并抛出异常。因此,vector数据类型如果是“失败透明”保证将会非常困难甚至不可能实现。但vector类型提供“强异常安全”保证却是相当容易的;在这种情况下, x 插入 v 或者成功,或者 v 保持不变。如果vector类型仅提供“基本异常安全”保证,如果数据插入失败, v 可能包含也可能不包含 x 的值,但至少 v 的内部表示是一致的。但如果vector数据类型是“最小异常安全”保证, v 可能会是无效的,例如 v 的计数域被增加了,但 x 并未实际插入,使得内部状态不一致。对于“异常不安全”的实现,程序可能会崩溃,例如写入数据到无效的内存。

通常至少需要基本异常安全。失败透明是难于实现的,特别是在编写库函数时,因为对应用程序的复杂知识缺少获知。

程序设计语言的异常机制

许多常见的程序设计语言,包括Actionscript,Ada,BlitzMax,C++,C#,D,ECMAScript,Eiffel,Java,ML,Object Pascal(如Delphi,Free Pascal等),Objective-C,Ocaml,PHP(version 5),PL/1,Prolog,Python,REALbasic,Ruby,Visual Prolog以及大多数.NET程序设计语言,内建的异常机制都是沿着函数调用栈的函数调用逆向搜索,直到遇到异常处理代码为止。一般在这个异常处理代码的搜索过程中逐级完成栈卷回(stack unwinding)。但Common Lisp是个例外,它不采取栈卷回,因此允许异常处理完后在抛出异常的代码处原地恢复执行。而Visual Basic(尤其是在其早于 .net 的版本,例如 6.0 中)走得更远: on error 语句可轻易指定发生异常后是重试( resume )还是跳过( resume next )还是执行程序员定义的错误处理程序( goto *** )。

多数语言的异常机制的语法是类似的:用 throw 或 raise 抛出一个异常对象(Java或C++等)或一个特殊可扩展的枚举类型的值(如Ada语言);异常处理代码的作用范围用标记子句( try 或 begin 开始的语言作用域)标示其起始,以第一个异常处理子句( catch, except, rescue 等)标示其结束;可连续出现若干个异常处理子句,每个处理特定类型的异常。某些语言允许 else 子句,用于无异常出现的情况。更多见的是 finally, ensure 子句,无论是否出现异常它都将执行,用于释放异常处理所需的一些资源。

C++异常处理是资源获取即初始化(Resource-Acquisition-Is-Initialization)的基础。

C语言一般认为是不支持异常处理的。Perl语言可选择支持结构化异常处理(structured exception handling)。

Python语言对异常处理机制是非常普遍深入的,所以想写出不含 try, except 的程序非常困难。


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱
发表评论
写好了,提交
{{item.label}}
{{commentTotal}}条评论
{{item.userName}}
发布时间:{{item.time}}
{{item.content}}
回复
举报
点击加载更多
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回

更多文章

更多精彩文章
打赏
私信

推荐阅读

· 血脂异常
血脂异常除少数是由于全身性疾病所致的继发性血脂异常外,绝大多数是因遗传基因缺陷或与环境因素相互作用引起的原发性血脂异常。1.遗传因素原发性血脂异常是由遗传基因缺陷或与环境因素相互作用引起。2.生活方式包括暴饮暴食、嗜酒、偏食、饮食不规律等不良饮食习惯及缺乏体力活动、精神紧张、生活不规律等。3.药物作用长期服用某种药物,如噻嗪类利尿剂、β受体阻滞剂、肾上腺皮质激素、口服避孕药等。4.继发性因素由于各种疾病继发引起的,如糖尿病、甲状腺功能减退、肾病综合征、肾移植、胆道阻塞等。主要分类:继发性高脂血症指由于全身系统性疾病所引起的血脂异常。可引起血脂升高的系统性疾病主要有糖尿病、肾病综合征、甲状腺功能减退症,其他疾病有肾功能衰竭、肝脏疾病、系统性红斑狼疮、糖原累积症、骨髓瘤、脂肪萎缩症、急性卟啉病、多囊卵巢综合征等。此外,某些药物如利尿剂、β受体阻滞剂、糖皮质激素等也可能引起继发性血脂升高。原发性...
· 血糖异常
度量单位:国际标准单位是毫摩尔/升(mmol/l)。美国采用毫克/分升(mg/dL)。由于葡萄糖分子C6H12O6是180g/mol,所以1mmol/L葡萄糖约等于18mg/dL。正常参考范围:空腹:3.89~6.11mmol/L(氧化酶法或己糖激酶法)。临床表现:增高:1.生理性增高:饭后1~2小时,注射葡萄糖后,情绪紧张时肾上腺素分泌增加,注射肾上腺素后,会使得血糖暂时性增高。2.病理性增高:各种糖尿病、慢性胰腺炎、心肌梗死、甲状腺功能亢进、肾上腺功能亢进、颅内出血等。降低:1.生理性降低:常见于饥饿、剧烈运动、注射胰岛素后、妊娠、哺乳和服用降糖药后。2.病理性降低:常见于胰岛细胞瘤、糖代谢异常、严重肝病、垂体功能减退、肾上腺功能减退、甲状腺功能减退、长期营养不良、注射胰岛素过量等。调控:人每天都要摄入各类含糖或淀粉的食物,这些食物再经过消化系统后,被转化为葡萄糖等单糖,并进入血液。但...
· 重力异常
大地测量与地球物理学在大地测量和地球物理学中,最常见的理论模型是椭球表面重力(英语:WGS84#WGS84)。为理解源于地下的重力异常,应做一些必要的还原以测量重力值:除去理论重力只留下当地影响值。每个重力测量点的海拔值要还原至相关基准以便进行整体数据比对,这是地表修正(Free-airCorrection),加上已除去理论值的重力观测值便是地表异常(free-airanomaly)。正常的重力梯度(重力海拔变化率),如地表通常为0.3086伽/米(mGal/m),或考虑该点下面岩石平均密度(2.67g/cm³)的布格梯度(Bouguergradient)为0.1967伽/米(mGal/m,19.67µm/(s²·m)),该数值源于重力减布格板块密度0.1119伽/米(mGal/m,11.19µm/(s²·m))。简言之,要做重力测量与大地水准面之间实质影响的修正。这样我们构建这两个值的模...
· 异常磁矩
电子对费米子磁矩的单循环修正异常磁矩的单循环修正对应最早且最大的量子力学修正,而电子的异常磁矩单循环修正可由右图顶点函数(英语:Vertexfunction)的计算所得。这个计算还是相对地直接的,单循环结果为:其中α为精细结构常数。这个结果最早由朱利安·施温格于1948年得出,而这个数也被铭刻在他的墓碑之上。电子异常磁矩的量子电动力学公式系数的计算到2009年已经用到α,而且已知解析值已逹到α。量子电动力学的预测值与实验观测值在超过10位有效数字时仍然一致,因此电子异常磁矩是物理学史上确认准确性最高的常数。现时的实验与误差为:根据以上的数值,a的已知准确度大概为十亿分之一(10)。要达到这样的准确度,量度g时的准确度需达千亿分之一(10)。μ子μ子g-2的单循环最小超对称标准模型(英语:MinimalSupersymmetricStandardModel)修正,分别内含超中性子和超μ子(左...
· 异常行为
异常行为分类美国精神医学会临床心理师与精神科医生,对异常行为发展出“心理疾病的诊断与统计”(DiagnosticandStatisticalManualofMentalDisorders,DSM)而这本手册并非理论性的解释心理疾病,仅只在每个疾病项目中列出症状,提供诊断方向。心理疾病种类繁杂,以下约略说明一些主要症状。焦虑症恐惧症:遭遇特定事件、情境,产生夸张反应。(无道理的害怕)恐慌症:重复、强烈性无法控制的焦虑,较为短暂。泛焦虑症:经常性、持续不断得高度焦虑,无特定目标强迫症:持续出现无法控制的想法与行为。压力异常症创伤后心理压力紧张症候群急性情感异常症忧郁症(单极性异常)躁郁症(两极性异常)解离性异常症解离性失忆解离性认同异常身体症状型异常身体化异常症转化症虑病症精神分裂症错乱型:心理混乱、幻觉、幻想僵直型:长时间持续相同动作妄想型:最常见的一种,被害、夸大幻想未分化型:上述皆无法区...

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信