作者:良知犹存

转载授权以及围观:欢迎添加微信:Allen-Iverson-me-LYN

总述

    在程序运行过程中经常会碰到一些问题,例如数组下标越界,除数为零等,这些错误不过能被发现处理,则我们的代码很有可能会导致程序崩溃。所以我们一般会针对可能导致程序崩溃的错误进行预测,C与C++都可以做。

但是C的判断代码要和相关函数执行的位置紧邻,甚至要紧密的耦合。而C++引入了错误处理机制,使得执行程序与错误检测的代码可以分离开,这样我们就可以安心的在单独的写代码,多次调用某个函数,而仅在某一处编写错误处理的代码即可。

异常提供了一种转移程序控制权的方式,涉及到C++异常处理的几个关键词有:

  1. throw :当问题出现时,程序会抛出一个异常的标志,这个抛出异常的动作就是由throw关键词完成的。

  2. catch:在我们处理问题的地方,通过异常处理程序捕获异常。catch关键字用于捕获异常。

  3. try: try块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个catch块。

一、throw

抛出异常

使用 throw 语句在代码块中的任何地方抛出异常。throw 语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出的异常的类型。可以抛出变量也可以抛出函数

void C(int i){    int    a =1;    double b =1.2;    float  c = 1.3;    if(i ==0)    {        cout<<"in C ,it is OK"<<endl;    }    else if(i==1)    {        throw a;    }    else if(i==2)    {        throw b;    }     else if(i==3)    {        throw c;    }    else if(i==4)    {        throw Myexception();    }    else if(i==5)    {        throw MySubexception();    }      }

二、try与catch

捕获异常

catch 块跟在 try 块后面,用于捕获异常。我们可以指定想要捕捉的异常类型,这是由 catch 关键字后的括号内的异常声明决定的。

void A(int i){    try{        B(i);    }catch(int t)    {        cout<<"catch int excepting  "<<t<<endl;    }catch(double d)    {        cout<<"catch double excepting  "<<d<<endl;    }catch(MySubexception &e){        e.waht();    }catch(Myexception &e){        e.waht();    }    catch(...)    {        cout<<"catch other excepting  "<<endl;    }}

如果你想让 catch 块能够处理 try 块抛出的任何类型的异常,则必须在异常声明的括号内使用省略号 ...,如下所示:

    catch(...)    {        cout<<"catch other excepting  "<<endl;    }

哪段代码可能发生错误,就把代码放入try中,catch进行捕捉。发生的代码片段用throw命令进行定义错误代码。

而一旦发生异常,中断程序执行,直接进入catch捕获。捕获的时候,先捕获小范围的,后捕获大范围的。

三、测试示例

#include <iostream>#include <string.h>#include <unistd.h>#include <stdlib.h>/*通过throw命令 抛出整型 浮点等,类与派生类,然后进行catch*/using namespace std;class Myexception{public:    void waht(void){cout<<"this is Myexception"<<endl;}};class MySubexception :public Myexception{public:    void waht(void){cout<<"this is MySubexception"<<endl;}};void C(int i){    int    a =1;    double b =1.2;    float  c = 1.3;    if(i ==0)    {        cout<<"in C ,it is OK"<<endl;    }    else if(i==1)    {        throw a;    }    else if(i==2)    {        throw b;    }     else if(i==3)    {        throw c;    }    else if(i==4)    {        throw Myexception();    }    else if(i==5)    {        throw MySubexception();    }      }void B(int i){    cout<<"call C..."<<endl;    C(i);    cout<<"After call C..."<<endl;}void A(int i){    try{        B(i);    }catch(int t)    {        cout<<"catch int excepting  "<<t<<endl;    }catch(double d)    {        cout<<"catch double excepting  "<<d<<endl;    }catch(MySubexception &e){        e.waht();    }catch(Myexception &e){        e.waht();    }    catch(...)    {        cout<<"catch other excepting  "<<endl;    }}int main(int argc,char** argv){    int i;    if(argc !=2)    {        cout<<"Usage: "<<endl;        cout<<argv[0]<<" <0|1|2|3> "<<endl;        return -1;    }    i = strtoul(argv[1],NULL,0);/*转化为整型*/    A(i);    return 0;}

这就是我分享的C++的异常处理,里面代码是实践过的,如果大家有什么更好的思路,欢迎分享交流哈。

更多分享,扫码关注我

微信:Allen-Iverson-me-LYN

12/100

文章标签:

c++ 添加文章标签
分类专栏:

C/C++

新建分类专栏

最多选择3个分类专栏#为二级分类
C/C++
Linux
物联网
ST
Win
ARM
嵌入式
IDE
cortex
ROS
随笔
IAR
代码升级
vs code
eclipse
MDK
DEBUG
CubeMX
开源协议
版本控制
git
资源信息:

文章类型:

请选择
原创
转载
翻译
*

申请原创将启用 Creative Commons 版权模板,如果不是原创文章,请选择转载或翻译。 原创文章默认开启打赏, 打赏管理
发布形式:

公开私密粉丝可见VIP可见收益中心

温馨提示:请勿发布涉及政治、广告、营销、翻墙、违反国家法律法规等内容,详见《CSDN资源共享规范》
发布博客返回

解析一下C++的异常处理的更多相关文章

  1. Android 启动过程的底层实现

    转载请标明出处:  http://blog.csdn.net/yujun411522/article/details/46367787 本文出自:[yujun411522的博客] 3.1 androi ...

  2. 自研框架wap.js实践

    示例 使用分为3个步骤: 1, 配置模板渲染中心,方便别人可以看到你的模板渲染,请求是什么关系,复杂度怎样 2, 配置事件分发中心  方便观察事件分发,事件复杂度 3,写对应的请求方法.渲染方法.   ...

  3. Python爬虫1-----------placekitten 入门

    常用的urllib库有三个类:request,parse,error,request主要完成对url的请求,如proxy,opener,urlopen,parse主要完成对html的解析,error负 ...

  4. micropython esp8266 烧录

    MicroPython 介绍 MicroPython 是一个 Python 3 语言的精简.高效实现,其包括 Python 标准库的一小部分,并经过优化,可以运行在微控制器和受限环境中运行. Micr ...

  5. 初探springmvc

    Springmvc是什么 Springmvc(spring web mvc)是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进 ...

  6. SpringMVC框架之第四篇

    5.SpringMVC异常处理 5.1.异常分类 1.可预知异常: Java编译时可检测异常,例如:IOException.SQLException等. 自定义异常(继承Exception父类的自定义 ...

  7. APIview的请求生命周期源码分析

    目录 APIview的请求生命周期源码分析 请求模块 解析模块 全局配置解析器 局部配置解析器 响应模块 异常处理模块 重写异常处理函数 渲染模块 APIview的请求生命周期源码分析 Django项 ...

  8. 《DNS稳定保障系列3--快如闪电,域名解析秒级生效》

    在刚刚过去的双十一,又是一个全民狂欢的盛宴,天猫双十一的成交量高达2684亿.无数小伙伴在淘宝.天猫里买买买,今年你又剁手了多少?言归正传,在你疯狂秒杀的时候,有没有发现,今年的购物体验一如既往的好, ...

  9. 哇咔咔干货来啦:PowerJob 原理剖析之 Akka Toolkit

    本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri HelloGitHub 推出的<讲解开源项目>系列. Akka is a toolkit for bui ...

随机推荐

  1. #3使用html+css+js制作网页 番外篇 使用python flask 框架 (I)

    #3使用html+css+js制作网页 番外篇 使用python flask 框架(I 第一部) 0. 本系列教程 1. 准备 a.python b. flask c. flask 环境安装 d. f ...

  2. .NET 云原生架构师训练营(模块二 基础巩固 RabbitMQ Masstransit 详解)--学习笔记

    2.6.7 RabbitMQ -- Masstransit 详解 Consumer 消费者 Producer 生产者 Request-Response 请求-响应 Consumer 消费者 在 Mas ...

  3. Navcat连接Mysql报错1521

    原因是新版的MySql密码加密算法改变,导致旧版本的Navcat连接报错. 解决方案: 1.升级Navcat 因为只是本地的Mysql,所以没验证这个方法,网传可以,此处不介绍. 2.修改Mysql加 ...

  4. 【SpringBoot1.x】SpringBoot1.x 启动配置原理 和 自定义starter

    SpringBoot1.x 启动配置原理 和 自定义starter 启动配置原理 本节源码 启动过程主要为: new SpringApplication(sources) 创建 SpringAppli ...

  5. 【C++】《C++ Primer 》第五章

    第五章 语句 一.简单语句 表达式语句:一个表达式末尾加上分号,就变成了表达式语句. 空语句:只有一个单独的分号,记得注释说明提高代码可读性. 复合语句(块):用花括号 {}包裹起来的语句和声明的序列 ...

  6. SpringBoot2.+restful风格请求方式设置以及表单中日期格式设置

    ​ 1).SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean.@Component)如果有就用用户配置的,如果没有,才自动配置:如果有些组件可以有多个(ViewR ...

  7. Python 日志打印之logging.getLogger源码分析

    日志打印之logging.getLogger源码分析 By:授客 QQ:1033553122 #实践环境 WIN 10 Python 3.6.5 #函数说明 logging.getLogger(nam ...

  8. CAN总线采样点测试

    采样点是什么? 采样点是接受节点判断信号逻辑的位置,CAN通讯属于异步通讯.需要通过不断的重新同步才能保证收发节点的采样准确. 若采样点太靠前,则因为线缆原因,DUT外发报文尚未稳定,容易发生采样错误 ...

  9. MySQL使用SQL操作数据表的增加、修改和删除

    表的修改和删除 修改 -- 修改表名称 -- ALTER TABLE 旧表名 RENAME AS 新表名 ALTER TABLE test RENAME AS test1 -- 增加表字段 -- AL ...

  10. 【win10】win10下两个显示器不同桌面壁纸

    win10系统下,双屏显示为不同的桌面壁纸 操作: 1.鼠标右键点击个性化 2.点击背景选项 3.在图片上右键选择要添加为背景的图片 同理,将另一个屏幕壁纸设为监视器1 最后效果为两个分屏为不同桌面壁 ...