解析一下C++的异常处理
2020-05-15 16:00:39来源:博客园 阅读 ()
解析一下C++的异常处理
作者:良知犹存
转载授权以及围观:欢迎添加微信:Allen-Iverson-me-LYN
总述
在程序运行过程中经常会碰到一些问题,例如数组下标越界,除数为零等,这些错误不过能被发现处理,则我们的代码很有可能会导致程序崩溃。所以我们一般会针对可能导致程序崩溃的错误进行预测,C与C++都可以做。
但是C的判断代码要和相关函数执行的位置紧邻,甚至要紧密的耦合。而C++引入了错误处理机制,使得执行程序与错误检测的代码可以分离开,这样我们就可以安心的在单独的写代码,多次调用某个函数,而仅在某一处编写错误处理的代码即可。
异常提供了一种转移程序控制权的方式,涉及到C++异常处理的几个关键词有:
-
throw :当问题出现时,程序会抛出一个异常的标志,这个抛出异常的动作就是由throw关键词完成的。
-
catch:在我们处理问题的地方,通过异常处理程序捕获异常。catch关键字用于捕获异常。
-
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
×
- 创作中心
- 2
首页
收益中心
数据观星
CSDN博客交流群
打开手机QQ扫码
或点击 这里加入群聊
QQ客服
原文链接:https://www.cnblogs.com/conscience-remain/p/12893774.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash