第六十三课、C语言的异常处理
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语言的异常处理的更多相关文章
- python六十三课——高阶函数之sorted
演示sorted函数的使用,以及和sort的区别:我们将sorted和sort进行一番比较:相同点:它们都是来实现排序的操作(功能层面)不同点:列表中的sort函数,它执行完毕后会直接影响原本这个li ...
- JAVA学习第六十三课 — 关于client服务端 && URL类 & URLConnection
常见的client和服务端 client: 浏览器:IE:弹窗体,猎豹:弹窗体.多标签,争强效果 服务端: server:TomCat:1.处理请求 2.给予应答 想让TomC ...
- NeHe OpenGL教程 第十三课:图像字体
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- “全栈2019”Java第六十三章:接口与抽象方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 孤荷凌寒自学python第六十三天学习mongoDB的基本操作并进行简单封装2
孤荷凌寒自学python第六十三天学习mongoDB的基本操作并进行简单封装2 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第九天. 今天继续学习mongoDB的简单操作, ...
- Kali Linux Web 渗透测试视频教程— 第十三课-密码破解
Kali Linux Web 渗透测试— 第十三课-密码破解 文/玄魂 目录 Kali Linux Web 渗透测试— 第十三课-密码破解............................... ...
- NeHe OpenGL教程 第四十三课:FreeType库
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第三十三课:TGA文件
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第二十三课:球面映射
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
随机推荐
- D. Beautiful Array
题目:http://codeforces.com/contest/1155/problem/D 给你n,x,一个n个数的序列,你可以选择一段区间,区间的数都乘以x,然后求出最大字段和 竟然是很简单的d ...
- The Largest Generation (25)(BFS)(PAT甲级)
#include<bits/stdc++.h>using namespace std;int n,m,l,t;int a[1307][137][67];int vis[1307][137] ...
- CF622F The Sum of the k-th Powers(拉格朗日插值)
题意 给出 \(n,k\) , \(n\le10^9,k\le10^6\) ,求 \(\sum_{i=1}^n i^k(mod\;10^9+7)\) 题解 自然数幂次和,是一个\(k+1\)次多项式, ...
- AtCoder Beginner Contest 115 题解
题目链接:https://abc115.contest.atcoder.jp/ A Christmas Eve Eve Eve 题目: Time limit : 2sec / Memory limit ...
- 2018年12月25&26日
小结:昨天因为整理课件,调代码耗费了大量时间,所以没来得及整理作业,这两天主要做的题目是关于树链剖分和线段树的,难度大约都是省选难度,毕竟只要涉及到树链剖分难度就肯定不低. 一. 完成的题目: 洛谷P ...
- 你的php
最开始学习做网页,用的是HTML,现在开始php了,那么要想用php,首先你得安装对不对,那么问题来了,你上哪安去啊(一看小编就是东北人),那么小编给各位提供了两个链接(不要告诉其他人哦)https: ...
- HTTP header parsing errors will be logged at DEBUG level
-- ::-exec-] INFO org.apache.coyote.http11.Http11Processor - Error parsing HTTP request header Note: ...
- 解决eclipse双击类名、选中类名出现假死或者非常慢的问题(取消Eclipse鼠标悬停和自定义快捷键)
eclipse(MyEclipse)关闭鼠标移动提示代码功能和自定义快捷键代码提示设置的方法 eclipse(MyEclipse)关闭鼠标移动提示代码功能: eclipse(MyEclipse)--& ...
- Angular2.0的学习(五)
第五节课: 1.组件的输入输出属性 2.使用中间人模式传递数据 3.组件生命周期以及Angular的变化发现机制
- docker镜像的分层结构三
docker的镜像分层 docker里的镜像绝大部分都是在别的镜像的基础上去进行创建的,也就是使用镜像的分层结构. 实验 比如说使用dockerfile去创建一个最简单的hello镜像.创建好对应的d ...