解析一下C++的异常处理

作者: 良知犹存

作者:良知犹存

转载授权以及围观:欢迎添加微信: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

×{js_advert_close}


首页

收益中心

数据观星

CSDN交流群

打开手机QQ扫码 或点击这里加入群聊

QQ客服
12/100
{cke_10} {cke_11} {cke_12} {cke_13} {cke_14} {cke_15} {cke_16} {cke_17} {cke_18} {cke_19} {cke_20} {cke_21} {cke_22} {cke_23} {cke_24} {cke_25} {cke_26} {cke_27} {cke_28} {cke_29} {cke_30} {cke_32} {cke_34} {cke_35} {cke_37}
文章标签:
c++ 添加文章标签
分类专栏:
C/C++ 新建分类专栏
最多选择3个分类专栏 为二级分类
C/C++
Linux
物联网
ST
Win
ARM
嵌入式
IDE
cortex
ROS
随笔
IAR
代码升级
vs code
eclipse
MDK
DEBUG
CubeMX
开源协议
版本控制
git
资源信息:
上传资源
文章类型:
请选择 原创 转载 翻译 *
申请原创将启用 Creative Commons 版权模板,如果不是原创文章,请选择转载或翻译。 原创文章默认开启打赏, 打赏管理
发布形式:
公开 私密 粉丝可见 VIP可见 收益中心
温馨提示:请勿发布涉及政治、广告、营销、FQ、违反国家法律法规等内容, 详见《CSDN资源共享规范》
发布 返回

原文作者:良知犹存

原文链接:https://www.cnblogs.com/conscience-remain/p/12893774.html

更多推荐

更多
  • Azure上Linux管理-十、使用 Azure Kubernetes 服务 技术要求,开始使用 AKS,与 Helm 一起工作,使用草稿,管理 Kubernetes,问题,进一步,使用 WSL 和 VS Code,安装依赖,kubectl 安装,使用 Azure CLI 创建集群,AKS 首次部署,创建服务,多
    Apache CN

  • Azure上Linux管理-十一、故障排除和监控您的工作负载 module(load="imuxsock"),技术要求,访问您的系统,Azure 日志分析,性能监控,问题,进一步,不允许远程访问,正在端口上工作,使用 nftables,引导诊断,Linux 登录,配置日志分析服务,安装 Azure
    Apache CN

  • Azure上Linux管理-十二、附录 第一章:探索微软 Azure 云,第二章:Azure 云入门,第三章:Linux 基础管理,第 4 章:管理 Azure,第五章:高级 Linux 管理,第七章:部署虚拟机,第八章:探索连续配置自动化,第 9 章:Azure 中的容器虚
    Apache CN

  • Azure上Linux管理-九、Azure 中的容器虚拟化 cloudconfig,集装箱技术导论,系统生成,Docker,Azure 容器实例,Buildah, Podman, and Skopeo,容器和储存,问题,进一步,容器历史,chroot 环境,OpenVZ,LXC,创建一个带启动的
    Apache CN

  • Azure上Linux管理-七、部署你的虚拟机 ResourceGroup 不存在,创建它:,vnet 不存在,创建 vnet,cloudconfig,Vagrant.config 结束,部署场景,Azure 中的自动部署选项,初始配置,流浪,封隔器,自定义虚拟机和 vhd,问题,进
    Apache CN

  • Azure上Linux管理-八、探索持续配置自动化 了解配置管理,使用 Ansible,使用地球形态,使用 PowerShell DSC,Azure 策略客户端配置,其他解决方案,问题,进一步,技术要求,Ansible 的安装,SSH 配置,裸最小配置,库存文件,Ansible 剧本和模
    Apache CN

  • Azure上Linux管理-五、高级 Linux 管理 技术要求,软件管理,网络,存储,systemd,问题,进一步,RPM 软件管理器,YUM 软件管理,基于 DNF 的软件管理,DPKG 软件管理器,运用 apt 进行软件管理,ZYpp 软件管理,识别网络接口,IP 地址识别,显示路由表
    Apache CN

  • Azure上Linux管理-六、管理 Linux 安全与身份 SELINUX=可以接受以下三个值之一:,permissiveSELinux 打印警告而不是强制执行。,disabled 没有加载 SELinux 策略。,SELINUXTYPE=可以接受以下三个值之一:,targeted 目标进程
    Apache CN

  • Azure上Linux管理-四、管理 Azure 使用 Azure CLI 和 PowerShell 管理 Azure 资源,技术要求,管理存储资源,管理网络资源,管理计算资源,虚拟机资源,问题,进一步,存储帐户,托管磁盘,Azure 文件,Azure Blob,虚拟网络,子网,网络安
    Apache CN

  • Azure上Linux管理-三、Linux 基础管理 Linux Shell,获取帮助,使用文本文件,在文件系统中找到你的方式,流程管理,自由访问控制,问题,执行命令,命令行编辑,与历史一起工作,自动完成,球状,重定向,处理变量,Bash 配置文件,使用手册页,使用信息文档,其他文档,文本
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多