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

CSDN博客交流群
打开手机QQ扫码
或点击这里加入群聊

QQ客服
新建分类专栏

解析一下C++的异常处理的更多相关文章
- Android 启动过程的底层实现
转载请标明出处: http://blog.csdn.net/yujun411522/article/details/46367787 本文出自:[yujun411522的博客] 3.1 androi ...
- 自研框架wap.js实践
示例 使用分为3个步骤: 1, 配置模板渲染中心,方便别人可以看到你的模板渲染,请求是什么关系,复杂度怎样 2, 配置事件分发中心 方便观察事件分发,事件复杂度 3,写对应的请求方法.渲染方法. ...
- Python爬虫1-----------placekitten 入门
常用的urllib库有三个类:request,parse,error,request主要完成对url的请求,如proxy,opener,urlopen,parse主要完成对html的解析,error负 ...
- micropython esp8266 烧录
MicroPython 介绍 MicroPython 是一个 Python 3 语言的精简.高效实现,其包括 Python 标准库的一小部分,并经过优化,可以运行在微控制器和受限环境中运行. Micr ...
- 初探springmvc
Springmvc是什么 Springmvc(spring web mvc)是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进 ...
- SpringMVC框架之第四篇
5.SpringMVC异常处理 5.1.异常分类 1.可预知异常: Java编译时可检测异常,例如:IOException.SQLException等. 自定义异常(继承Exception父类的自定义 ...
- APIview的请求生命周期源码分析
目录 APIview的请求生命周期源码分析 请求模块 解析模块 全局配置解析器 局部配置解析器 响应模块 异常处理模块 重写异常处理函数 渲染模块 APIview的请求生命周期源码分析 Django项 ...
- 《DNS稳定保障系列3--快如闪电,域名解析秒级生效》
在刚刚过去的双十一,又是一个全民狂欢的盛宴,天猫双十一的成交量高达2684亿.无数小伙伴在淘宝.天猫里买买买,今年你又剁手了多少?言归正传,在你疯狂秒杀的时候,有没有发现,今年的购物体验一如既往的好, ...
- 哇咔咔干货来啦:PowerJob 原理剖析之 Akka Toolkit
本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri HelloGitHub 推出的<讲解开源项目>系列. Akka is a toolkit for bui ...
随机推荐
- node.js常用内置模块一
在使用内模块的时候需要先将所需的内置模块进行引入. OS模块 在nodejs中OS模块提供了与操作系统相关的属性和方法 // 导入OS内置模块,必须先进行导入,否则无法使用 const os = re ...
- Flutter 基础组件:输入框和表单
前言 Material组件库中提供了输入框组件TextField和表单组件Form. 输入框TextField 接口描述 const TextField({ Key key, // 编辑框的控制器,通 ...
- Centos搭建Git服务端
首先需要安装git,可以使用yum源在线安装 yum install -y git 创建一个git用户,用来运行管理git服务 adduser git 初始化git仓库(这里我们选择/home/git ...
- explain extended;show warnings
mysql> explain extended select count(*) from xuehao;+----+-------------+-------+------+---------- ...
- ctfshow—web—web签到题
打开靶机,发现只有一句话 查看源码 发现一段字符串,猜是base64加密 拿到flag
- 基于kubernetes实现coredns的及验证
CoreDNS: k8s内部的DNS ,用于对pod对service做记录的,好让其他的pod做访问 这里不用做过多的阐述 官方kube-dns现在已经没有在维护了,从Kubernetes 1.11 ...
- Netty学习:ChannelHandler执行顺序详解,附源码分析
近日学习Netty,在看书和实践的时候对于书上只言片语的那些话不是十分懂,导致尝试写例子的时候遭遇各种不顺,比如decoder和encoder还有HttpObjectAggregator的添加顺序,研 ...
- 入门OJ:Coin
题目描述 你有n个硬币,第i硬币面值为ai,现在总队长想知道如果丢掉了某个硬币,剩下的硬币能组成多少种价值?(0价值不算) 输入格式 第一行一个整数n 第二行n个整数.,a1,a2-an. 1< ...
- 一种获取context中keys和values的高效方法 | golang
我们知道,在 golang 中的 context 是一个非常重要的包,保存了代码活动的上下文.我们经常使用 WithValue() 这个方法,来往 context 中 传递一些 key value 数 ...
- 试玩 GOWOG ,初探 OpenAI(使用 NeuroEvolution 神经进化)与 Golang 多人在线游戏开发
GOWOG: 原项目:https://github.com/giongto35/gowog 我调整过的:https://github.com/Kirk-Wang/gowog GOWOG 是一款迷你的, ...