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. Spring MVC 基于Method的映射规则(注解版)

    在Restful风格的web开发中,根据不同的请求方法使用相应的控制器处理逻辑成为核心需求,下面就看看如何在Spring MVC中识别不同的请求方法. 请求方法 在Http中,请求的方法有很多种,最常 ...

  2. 解读人:谭亦凡,Macrophage phosphoproteome analysis reveals MINCLE-dependent and -independent mycobacterial cord factor signaling(巨噬细胞磷酸化蛋白组学分析揭示MINCLE依赖和非依赖的分支杆菌索状因子信号通路)(MCP换)

    发表时间:2019年4月 IF:5.232 一. 概述: 分支杆菌索状因子TDM(trehalose-6,6’-dimycolate)能够与巨噬细胞C-型凝集素受体(CLR)MINCLE结合引起下游通 ...

  3. Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance

    standard:Activity的默认加载方法,即使某个Activity在Task栈中已经存在,另一个activity通过Intent跳转到该activity,同样会新创建一个实例压入栈中.例如:现 ...

  4. Tomcat热部署的实现原理

    Tomcat热部署机制 对于Java应用程序来说,热部署就是在运行时更新Java类文件.在基于Java的应用服务器实现热部署的过程中,类装入器扮演着重要的角色.大多数基于Java的应用服务器,包括EJ ...

  5. 异常HttpMessageNotWritableException解决办法

    1. 问题描述 在写SpringBoot项目的时候,由于是前后端分离项目,为了统一接口形式,使用一个类封装了返回数据的形式,但是在测试的时候报异常HttpMessageNotWritableExcep ...

  6. Go入门基础手记

    1. 配置环境变量(临时) export GOPATH=yourpath 2. 跨平台交叉编译 env GOOS=linux GOARCH=amd64 go build 3. test写法 // 首先 ...

  7. Webpack热加载和React(其中有关于include和exclude的路径问题)

    看了几个React配合webpack的教程,大部分都因为版本问题过时了.终于找到了一个不错的教程.记录下其中的知识点. 首先万分感谢这个教程的制作者.少走了许多弯路,正在学习webpack的小伙伴可以 ...

  8. Xml2Object

    <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream ...

  9. 自动化测试 - Appium + Python史上最全最简环境搭建步骤

    一,为什么是Appium借一张图: 1.1 Appium优点 l  开源 l  跨架构:NativeApp.Hybird App.Web App l  跨设备:Android.iOS.Firefox ...

  10. Maven_setting.xml

    <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Soft ...