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

2020-05-15 16:00:39来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

解析一下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

 

 

×
    • 博客
    • 学院
    • 下载
    • 论坛
    • 问答
    • 直播
    • 招聘
    • APP
    • VIP会员
  • 创作中心
  • 2
Markdown编辑器富文本编辑器
  • 博客管理
    • 文章管理
    • 评论管理
    • 分类专栏
    • 订阅专栏
    • 博客搬家
    • 博客打赏
    • 博客设置
    • 博客模块管理
    • 自定义域名
    • 博客等级权益

CSDN博客交流群

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

QQ客服

12/100                           c++ C/C++ 最多选择3个分类专栏#为二级分类 上传资源 * 申请原创将启用 Creative Commons 版权模板,如果不是原创文章,请选择转载或翻译。 原创文章默认开启打赏, 打赏管理 收益中心  温馨提示:请勿发布涉及政治、广告、营销、翻墙、违反国家法律法规等内容,详见《CSDN资源共享规范》

原文链接:https://www.cnblogs.com/conscience-remain/p/12893774.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:1.ffmpeg、ffplay、ffprobe命令使用

下一篇:C++17结构化绑定