http://www.cnblogs.com/gui-lin/p/6379101.html

一、异常处理

1、异常的概念

(1)、程序在运行过程中可能产生异常

(2)、异常(Exception)和Bug的区别

A、异常是程序运行时可预料的执行分支

B、Bug是程序中的错误,是不被预期的运行方式

2、异常(Exception)和Bug的对比

(1)异常

A、运行时产生除0的情况

B、需要打开的外部文件存在

C、数组访问越界

(2)、Bug

A、使用野指针

B、堆数组使用结束后未释放

C、选择排序无法处理长度为0的数组

3、C语言经典处理方式:if....else.....

#include <iostream>

using namespace std;

double divide(double a, double b, int* valid)
{
const double delta = 0.000000000000001;
double ret = 0; if(!((-delta < b) && (b < delta)))
{
ret = a / b;
*valid = 1; //正常
}
else
{
*valid = 0; //除0错误
}
return ret;
} int main()
{
int valid = 0;
double r = divide(1, 0, &valid); //当第3个参数为NULL时,还是会出问题 if(valid)
{
cout << "r = " << r << endl;
}
else
{
cout << "Divide by zero..." << endl;
} return 0;
}

 4、缺陷

(1)、divide函数有三个参数,难以理解其用法

(2)、divide函数调用后必须判断valid代表的结果

A、当valid为true时,运算结果正常

B、valid为false时,运行结果出现异常

二、优化方式

1、通过setjmp()和longjmp()进行优化

(1)、int  setjmp(jmp_buf env)

A、将当前上下文保存在jmp_buf结构体中

(2)void setjmp(jmp_buf env, int val)

A、从jmp_buf结构体中恢复setjmp()保存上下文

B、最终从setjmp()函数调用点返回,返回值为val

#include <iostream>
#include <csetjmp> //for setjmp、longjmp(); using namespace std; static jmp_buf env; //须定义全局的上下文环境 double divide(double a, double b)
{
const double delta = 0.000000000000001;
double ret = 0; if(!((-delta < b) && (b < delta)))
{
ret = a / b;
}
else
{
longjmp(env, 1); //当错误发生时会跳转到setjmp那么的代码
//处,重新执行setjmp并把其的返回值设为1
}
return ret;
} int main()
{ if(setjmp(env) == 0) //先保存上下文环境,刚调用时返回值为0
{
double r = divide(1, 0);
cout << "r = " << r << endl;
}
else
{
cout << "Divide by zero..." << endl;
} return 0;
}

2、缺陷:setjmp()和longjmp()的引入

(1)、必须涉及到使用全局变量

(2)、暴力跳转导致代码可读性降低

(3)、本质还是if...else...的处理方式

三、小结

(1)、程序中不可避免的会发生异常

(2)、异常是在开发阶段就可以预见的运行时问题

(3)、C语言中通过经典的if-else

(4)、C++中存在更好的异常处理方式

第六十三课、C语言的异常处理的更多相关文章

  1. python六十三课——高阶函数之sorted

    演示sorted函数的使用,以及和sort的区别:我们将sorted和sort进行一番比较:相同点:它们都是来实现排序的操作(功能层面)不同点:列表中的sort函数,它执行完毕后会直接影响原本这个li ...

  2. JAVA学习第六十三课 — 关于client服务端 &amp;&amp; URL类 &amp; URLConnection

    常见的client和服务端 client:       浏览器:IE:弹窗体,猎豹:弹窗体.多标签,争强效果 服务端:       server:TomCat:1.处理请求 2.给予应答 想让TomC ...

  3. NeHe OpenGL教程 第十三课:图像字体

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. “全栈2019”Java第六十三章:接口与抽象方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. 孤荷凌寒自学python第六十三天学习mongoDB的基本操作并进行简单封装2

    孤荷凌寒自学python第六十三天学习mongoDB的基本操作并进行简单封装2 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第九天. 今天继续学习mongoDB的简单操作, ...

  6. Kali Linux Web 渗透测试视频教程— 第十三课-密码破解

    Kali Linux Web 渗透测试— 第十三课-密码破解 文/玄魂 目录 Kali Linux Web 渗透测试— 第十三课-密码破解............................... ...

  7. NeHe OpenGL教程 第四十三课:FreeType库

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  8. NeHe OpenGL教程 第三十三课:TGA文件

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  9. NeHe OpenGL教程 第二十三课:球面映射

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

随机推荐

  1. java8List集合根据对象的属性去重

    import static java.util.Comparator.comparingLong; import static java.util.stream.Collectors.collecti ...

  2. 帝都Day4(1)——还是dp

    其实是day4 一.洛谷P1018 乘积最大 f[i][j]表示前i个数 切成j块 用f[i][j]而不用f[i][j][k](i到j切成k块)呢? Luogu1043 前缀和(好算一段里的数的和)+ ...

  3. Spring-【高阶】注解-转载

    从Spring2.0以后的版本中,Spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以取代 ...

  4. POJ2388-Who's in the Middle

    题目链接:点击打开链接 Who's in the Middle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 45683   ...

  5. 理解js继承的6种方式

    想要继承,就必须要提供个父类(继承谁,提供继承的属性) 一.原型链继承 重点:让新实例的原型等于父类的实例. 特点:1.实例可继承的属性有:实例的构造函数的属性,父类构造函数属性,父类原型的属性.(新 ...

  6. P1984 [SDOI2008]烧水问题(具体证明)

    传送门 我见过的第二恶心的题,第一是糖果传递... 以下是一堆具体的证明,自己想的,可能考虑不周,不想看也可以直接看结论 首先有一个很显然的贪心,烧开的水要尽量把热量传递出去 所以有一个比较显然的方法 ...

  7. JS——变量和函数的预解析、匿名函数、函数传参、return

    JS解析过程分为两个阶段:编译阶段.执行阶段.在编译阶段会将函数function的声明和定义都提前,而将变量var的声明提前,并将var定义的变量赋值为undefined. 匿名函数: window. ...

  8. 解决gap 采用increapment scn 方式 操作。

    ###########1 1.查看备库的scn ⚠️如果控制文件,数据文件,数据文件头部的scn不一致,需要根据日志中的gap的起始sequence# 找到对应的scn col  current_sc ...

  9. 配置了SSH后还是每次都要求输入密码

    保存凭证可以解决问题 git config --global credential.helper store

  10. Android的网络通信

    Android平台有三种网络接口可以使用,他们分别是:java.net.*(标准Java接口).Org.apache接口和Android.net.*(Android网络接口).大多数的Android应 ...