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. vue -- 打包资源正确引用及背景图引入

    一般情况下,通过webpack+vuecli默认打包的css.js等资源,路径都是绝对的. 但当部署到带有文件夹的项目中,这种绝对路径就会出现问题,因为把配置的static文件夹当成了根路径,那么要解 ...

  2. Claris’ Contest # 2 Day 2 Problem C. Dash Speed(分治+可持久化并查集+树剖)

    题面 题解 \(std\)爆栈了→_→ 我们先考虑一个简化的问题,如果只有加边的情况下如何动态维护直径 合并两棵树时,设\(a,b\)为\(A\)的直径的两个端点,\(c,d\)为\(B\)的直径的两 ...

  3. [Xcode 实际操作]三、视图控制器-(11)在Storyboard中使用表格控件

    目录:[Swift]Xcode实际操作 本文将演示表格控件在故事板中的使用. 点击[显示或隐藏检查器按钮],再界面右侧打开检查器面板. 在控制器根视图上点击鼠标,以选择该根视图. 现在往根视图中添加一 ...

  4. css 权重值(层叠性)详解

    目录 css权重值(重叠性)实例 权重值的计算 !important 提升权重值实例 什么情况下可以使用!important ? 总结: css权重值(重叠性)实例 css中有很多选择器,那在多个选择 ...

  5. 解决Maven项目中jar包依赖冲突问题

    版本冲突的解决方案 [1]调节原则 [1]路径最短者优先原则 [2]路径相同时,先声明者优先原则 [2]排除原则:用于排除某项依赖的依赖jar包 <dependency> <grou ...

  6. 帝都Day6——图论

    //P2O5呢? 一.图的存储: 邻接矩阵:邻接表. 邻接矩阵:n*n的[][],[i][j]节点有边记1没边0 缺点 空间复杂度O(n^2) 占用内存较大(我为什么要把这些东西写到这里呢???) 邻 ...

  7. Stream流、方法引用

    Stream流.方法引用 Stream流.方法引用 Stream流.方法引用 Stream流.方法引用 Stream流.方法引用 ... ...

  8. OJDBC版本区别:ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别

    classes12.jar - for Java 1.2 and 1.3ojdbc14.jar - for Java 1.4 and 1.5ojdbc5.jar - for Java 1.5ojdbc ...

  9. c# 手动实现 \u 转义字符。。效果。。。

    string s ="\\u"+item.Icon; // item.Icon = UnicodeEncoding.Unicode.GetString(UnicodeEncodin ...

  10. Luogu P4551 最长异或路径 01trie

    做一个树上前缀异或和,然后把前缀和插到$01trie$里,然后再对每一个前缀异或和整个查一遍,在树上从高位向低位贪心,按位优先选择不同的,就能贪出最大的答案. #include<cstdio&g ...