热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第25节异常处理–上

-------------------------------------资源来源于网络,仅供自学使用,如有侵权,联系我必删.第一:异常处理初探所有的代码都有可能不按照预定义的

-------------------------------------资源来源于网络,仅供自学使用,如有侵权,联系我必删.

第一:

异常处理初探

 所有的代码都有可能 不按照 预定义的方式运行

 

? 这一组函数单纯的实现了四则运算
    ?  但是除法函数却总是会有意外 。。。

很明显 , 当除数为0 的时候 , Div 函数的调用将产生无法预见的错误

 

C 方式的解决方案

#include
#include using namespace std;double Div(double a, double b, bool* valid)//除法
{*valid = true;//向不知道是否为空valid指针空间里写入值if( (-0.000000001 }double Add(double a, double b)//加法
{return a + b;
}double Minus(double a, double b)//减法
{return a - b;
}double Multi(double a, double b)//乘法
{return a * b;
}int main(int argc, char *argv[])
{bool v &#61; false;cout<}

缺陷:
1) 每次调用 Div 函数后都必须判断结果是否合法
2) 参数 valid 如果没有指向合法的内存空间会产生错误

 

第二:

程序中会出现大量的处理异常的代码

 

 C 方式的典型调用代码

#include
#include using namespace std;int MemSet(void* dest, unsigned int length, unsigned char v)
{//指针合法性判断if( dest &#61;&#61; NULL )//指针不为空{return -1;}//项目需要,大小不小于4if( length <4 ){return -2;}//工程需求范围在0-9if( (v <0) || (v > 9) ){return -3;}//正常代码unsigned char* p &#61; (unsigned char*)dest;for(int i&#61;0; i}int main(int argc, char *argv[])
{int ai[5];double ad[4];char ac[3];int ret;//正常逻辑代码和异常处理代码混合在一起 &#xff0c; 导致代码迅速膨胀 &#xff0c; 难以维护ret &#61; MemSet(ai, sizeof(ai), 0);if( ret &#61;&#61; 0 ){}else if( ret &#61;&#61; -1 ){}else if( ret &#61;&#61; -2 ){}else if( ret &#61;&#61; -3 ){}//正常逻辑代码和异常处理代码混合在一起 &#xff0c; 导致代码迅速膨胀 &#xff0c; 难以维护ret &#61; MemSet(ad, sizeof(ad), 1);if( ret &#61;&#61; 0 ){}else if( ret &#61;&#61; -1 ){}else if( ret &#61;&#61; -2 ){}else if( ret &#61;&#61; -3 ){}//正常逻辑代码和异常处理代码混合在一起 &#xff0c; 导致代码迅速膨胀 &#xff0c; 难以维护ret &#61; MemSet(ac, sizeof(ac), 2);if( ret &#61;&#61; 0 ){}else if( ret &#61;&#61; -1 ){}else if( ret &#61;&#61; -2 ){}else if( ret &#61;&#61; -3 ){}cout <<"Press the enter key to continue ...";cin.get();return EXIT_SUCCESS;
}

缺陷:
正常逻辑代码和异常处理代码混合在一起 &#xff0c; 导致代码迅速膨胀 &#xff0c; 难以维护 。。。

 

第三

其它C 方式的异常处理方案
? go to 语句
? setjmp() longjmp()

#include
#include using namespace std;int MemSet(void* dest, unsigned int length, unsigned char v)
{if( dest &#61;&#61; NULL ){return -1;}if( length <4 ){return -2;}if( (v <0) || (v > 9) ){return -3;}unsigned char* p &#61; (unsigned char*)dest;for(int i&#61;0; i}int main(int argc, char *argv[])
{int ai[5];double ad[4];char ac[3];int ret &#61; 0;ret &#61; MemSet(ai, sizeof(ai), 0);if( ret !&#61; 0 ){goto ERROR;}ERROR:cout <<"Press the enter key to continue ...";cin.get();return EXIT_SUCCESS;
}

? 在C语言中可以使用上面两种解决方案将异常处理代码放到统一的地方 &#xff0c; 与正常逻辑代码分开
? 但在 C&#43;&#43; 中 &#xff0c; 这两种方法可能导致对象的构造函数或者析构函数得不到调用而引发错误

 

第四:

C&#43;&#43; 中的异常处理

?  C&#43;&#43; 中提供了 trycatch 语句块对可能产生异常的代码进行分开处理
    ?  try 语句块处理正常逻辑
    ?  catch 语句块处理异常
?  C&#43;&#43; 语言中通过 throw 语句引发一个异常

#include
#include using namespace std;#define DIV_ZERO_ERROR -1double Div(double a, double b)
{if( (-0.000000001 }int main(int argc, char *argv[])
{try//正常逻辑代码{cout<}

 

第五:

?  throw 语句用于将异常 “ 对象 ” 抛出
    ?  throw 语句将异常抛出 &#xff0c; 如果在当前函数中没有 try … catch语句能够处理该异常 &#xff0c; 则当前函数将立即返回
        ?  异常被传递到上层调用函数 &#xff0c; 仍然需要 try … catch 语句进行处理 &#xff0c; 如果上层函数也没有能力处理该异常 &#xff0c; 则异常继续向更上层函数的函数传递 。。。
?  如果在函数调用栈中的所有函数都无法处理抛出的异常 &#xff0c; 则程序异常中止

使用try…catch

#include
#include using namespace std;void MemSet(void* dest, unsigned int length, unsigned char v)
{if( dest &#61;&#61; NULL ){throw -1;}if( length <4 ){throw -2;}if( (v <0) || (v > 9) ){throw -3;}unsigned char* p &#61; (unsigned char*)dest;for(int i&#61;0; i}int main(int argc, char *argv[])
{int ai[5];double ad[4];char ac[3];try//正常代码:3个数组内存设置{MemSet(ai, sizeof(ai), 0);MemSet(ad, sizeof(ad), 1);MemSet(ac, sizeof(ac), 2);}catch(int e){cout<}

 

第六:

?  同一个 try 语句块可以跟上多个 catch 语句块
    ?  同一个 try 语句块可以抛出多种不同类型的异常
    ?  不同类型的异常由不同的 catch 语句块负责处理
?  异常被抛出后会自上而下逐一匹配 catch 语句块
    ?  异常匹配时 &#xff0c; 不会进行默认类型转换

try … catch 匹配示例

#include
#include using namespace std;int test(int i)
{if( i &#61;&#61; 1 ){throw -1; //int类型 异常}if( i &#61;&#61; 2 ){throw "ERROR"; //char*字符 异常}if( i &#61;&#61; 3 ){throw 0.5; //double类型 异常}if( i &#61;&#61; 4 ){throw &#39;d&#39;; //char字符型 异常}return i;
}int main(int argc, char *argv[])
{for(int i&#61;0; i<5; i&#43;&#43;){//一个try 对应 多个catch函数try{cout<}

 

小结

?   异常处理是程序中随处可见的情况

?  在工程实践中 &#xff0c; 大多数的代码都是用于处理异常的
?  异常处理的质量直接决定最终产品的质量
?  C&#43;&#43; 提供了 try … catch 语句用于将正常逻辑代码与异常处理代码进行分开处理


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
author-avatar
手机用户2602881417
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有