评论

收藏

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

编程语言 编程语言 发布于:2021-07-06 19:13 | 阅读数:297 | 评论:0

DSC0000.png

  总述
  在程序运行过程中经常会碰到一些问题,例如数组下标越界,除数为零等,这些错误不过能被发现处理,则我们的代码很有可能会导致程序崩溃。所以我们一般会针对可能导致程序崩溃的错误进行预测,C与C++都可以做。
  但是C的判断代码要和相关函数执行的位置紧邻,甚至要紧密的耦合。而C++引入了错误处理机制,使得执行程序与错误检测的代码可以分离开,这样我们就可以安心的在单独的写代码,多次调用某个函数,而仅在某一处编写错误处理的代码即可。
  异常提供了一种转移程序控制权的方式,涉及到C++异常处理的几个关键词有:

  •   throw :当问题出现时,程序会抛出一个异常的标志,这个抛出异常的动作就是由throw关键词完成的。
  •   catch:在我们处理问题的地方,通过异常处理程序捕获异常。catch关键字用于捕获异常。
  •   try: try块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个catch块。



  一、throw

DSC0001.png
抛出异常
  使用 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;}
DSC0002.png

DSC0003.png

DSC0004.jpeg


  
关注下面的标签,发现更多相似文章