C++:异常的处理
6.4 异常处理
程序中常见的错误分为两大类:编译时期的错误和运行时期的错误。
编译时期的错误比较简单容易发现:主要是语法错误,如关键字拼写错误、缺分号、括号不匹配等
运行时期的错误比较难发现,甚至是不可预料的:如算法出错、内存空间不足、角标越界、文件无法打开等
处理异常有两种方式:传统的异常处理方法、系统异常处理机制。
传统异常处理方法特点:是采用判断和分支语句类实现,适合满足小型的应用程序。
系统异常处理机制特点:通过检测、抛出并捕获异常来实现,适合各种大型应用程序
//例6.10 传统的异常处理方法举例
#include<iostream>
using namespace std;
inline int DIV(int x,int y);
int main()
{
cout<<"7/3="<<DIV(,)<<endl;
cout<<"5/0="<<DIV(,)<<endl;
return ;
}
inline int DIV(int x,int y)
{
if(y==)
{
cout<<"除数为0,错误!"<<endl;
exit();
}
return x/y;
}
6.4.2 异常处理的方法
C++处理异常的办法是:如果在执行一个函数过程中出现异常,可以不在本函数中立即处理,而是发出一个信息,传给它的上一级(即调用函数)来解决,如果上一级也不能处理,就再传其上一级,由上一级处理,如此逐级上传,如果到最高一级还无法处理,运行系统一般会自动调用系统函数terminate,由它调用abort终止程序。
这样的处理方法使得异常的引发和处理机制分离,而不是有同一个函数完成。这样的做法的好处是使底层函数(被调用函数)着重用于解决实际任务,而不必过多的考虑对异常的处理,以减轻底层函数的负担,而把处理异常的任务移到上层去处理。
C++处理异常的机制是由检查、抛出和捕获3个部分组成,分别由3中语句来完成;try(检查)、
throw(抛出)、catch(捕获)
1.异常的抛出
抛出异常使用throw语句,其格式如下:
throw 表达式;
如果在某段程序中发现了异常,就可以使用throw语句来抛出异常给调用者,该异常由与之匹配的catch语句来捕获。throw语句中的"表达式”是可以抛出的异常类型,异常类型由表达式的类型来表示。例如上例中的异常处理:
inline int DIV(int x,int y)
{
if(y==)
throw y; //抛出异常,当除数为0时,语句throw将抛出int型异常
return x/y;
} 由于变量y的类型是int型,所以当除数为0时语句throw将抛出int型异常
2.异常的检查与捕获
异常的检查try语句与捕获catch语句的格式如下:
try
{
被检查的复合语句
}
catch(异常类型声明 )
{
进行异常处理的复合语句
}
catch(异常类型声明 )
{
进行异常处理的复合语句
}
......
catch(异常类型声明 n)
{
进行异常处理的复合语句 n
}
例如上述例子的异常检查与捕获:
try //检查异常
{
cout<<"7/3="<<DIV(,)<<endl; //被检查的复合语句
cout<<"5/0="<<DIV(,)<<endl;
}
catch(int) //捕获异常,异常类型为int类型
{
cout<<"除数为0,错误!"<<endl; //进行异常处理的复合语句
}
//例6.11 处理除数为0异常的程序。
#include<iostream>
using namespace std;
inline int DIV(int x,int y);
int main()
{
try
{
cout<<"7/3="<<DIV(,)<<endl;
cout<<"5/0="<<DIV(,)<<endl;
}
catch(int i)
{
cout<<"i="<<i<<endl;
cout<<"除数为0,错误!"<<endl;
cout<<"over\n";
}
return ;
}
inline int DIV(int x,int y)
{
if(y==)
throw y;
return x/y;
}
程序运行结果是:
7/3=2
除数为0,错误!
over
在本例中,进行异常处理的方法如下:
(1)首先将需要检查,也是容易引起异常的语句或程序段放在try块的花括号中。
(2)如果在执行try语句块内的复合语句过程中没有发生异常,则catch子句不起作用,继续转到catch子句后面的语句继续进行。
(3)如果在执行try块内的复合语句(或被调用函数)过程中发生异常,则throw语句抛出一个异常信息。
(4)throw抛出的异常信息传到try_catch结构,系统寻找与之匹配的catch子句。
(5)执行异常处理语句后,程序继续执行catch子句后的语句。
说明:
(1)被检测的语句或程序段必须放在try块中,否则不起作用。
(2)try和catch块中必须有用花括号括起来的复合语句,即使花括号内只有一个语句也不能省略花括号。
(3)一个try_catch结构中只能有一个try块,但却可以有多个catch块,以便与不同的异常信息匹配。catch后面的括号中,一般只写异常信息的类型名。
(4)如果在catch语句中没有指定异常信息的类型,而是采用了三点删节点"...",则表示它可以捕获任何类型的异常信息。
(5)在某种情况下,在throw语句中可以不包括表达式,如;throw;此时它将当前正在处理的异常信息再次抛出,给起上一层的catch块处理。
(6)C++中,一旦抛出一个异常,而程序又不捕获的话,那么系统就调用系统函数terminate,由它调用abort终止程序。
//例6.12 有多个catch块的异常处理程序。
#include<iostream>
using namespace std;
int main()
{
double a=2.3;
try
{
throw a;
}
catch(int)
{
cout<<"异常发生!整数型!"<<endl;
}
catch(double)
{
cout<<"异常发生!双精度型!"<<endl;
}
cout<<"end"<<endl;
return ;
} /*
程序运行结果是:
异常发生!双精度型!
end
*/
//例 6.13 有删节点的异常处理程序。
#include<iostream>
using namespace std;
void func(int x)
{
if(x)
throw x;
}
int main()
{
try
{
func();
cout<<"No here!"<<endl;
}
catch(...)
{
cout<<"异常发生!任意类型!"<<endl;
}
cout<<"end"<<endl;
return ;
}
/*
程序运行结果是:
异常发生!任意类型!
end
*/
C++:异常的处理的更多相关文章
- alias导致virtualenv异常的分析和解法
title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...
- ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”
在<ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式>中,我们通过几个简单的实例演示了如何呈现一个错误页面,这些错误页面的呈现分别由三个对应的中间件来完成,接下来我们将 ...
- 记一次tomcat线程创建异常调优:unable to create new native thread
测试在进行一次性能测试的时候发现并发300个请求时出现了下面的异常: HTTP Status 500 - Handler processing failed; nested exception is ...
- 使用JSONObject.fromObject的时候出现“There is a cycle in the hierarchy”异常 的解决办法
在使用JSONObject.fromObject的时候,出现“There is a cycle in the hierarchy”异常. 意思是出现了死循环,也就是Model之间有循环包含关系: ...
- SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论
异常汇总:http://www.cnblogs.com/dunitian/p/4523006.html#signalR 后台创建了一个DntHub的集线器 前台在调用的时候出现了问题(经检查是代理对象 ...
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- [C#] C# 知识回顾 - 学会处理异常
学会处理异常 你可以使用 try 块来对你觉得可能会出现异常的代码进行分区. 其中,与之关联的 catch 块可用于处理任何异常情况. 一个包含代码的 finally 块,无论 try 块中是否在运行 ...
- [C#] C# 知识回顾 - 学会使用异常
学会使用异常 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”. 异常通常由错误的代码引发,并由能够更正错误的代码进行 catch. 异常可由 .NET 的 CLR ...
- [C#] C# 知识回顾 - 异常介绍
异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...
- 基于AOP的MVC拦截异常让代码更优美
与asp.net 打交道很多年,如今天微软的优秀框架越来越多,其中微软在基于mvc的思想架构,也推出了自己的一套asp.net mvc 框架,如果你亲身体验过它,会情不自禁的说‘漂亮’.回过头来,‘漂 ...
随机推荐
- 《实时控制软件设计》Git 基本操作练习
根据老师提供的教程 对 数据库创建.提交文件.创建分支.删除分支.合并分支.冲突处理等操作进行了练习 得到log文件如下: yanbin-guo@yanbinguo MINGW64 /Git (mas ...
- 五、案例-指令参考-freemarker指令、表达式
案例-指令参考描述:本人自己测试写了一遍,如有错的地方,懂freemarker的朋友望指点指点! 案例-指令参考 表达式 一. Assign 1.<#assign name1="北京& ...
- TF/IDF(term frequency/inverse document frequency)
TF/IDF(term frequency/inverse document frequency) 的概念被公认为信息检索中最重要的发明. 一. TF/IDF描述单个term与特定document的相 ...
- 我给女朋友讲编程html系列(4) -- html常用简单标签
今天似乎有点感冒,浑身无力,在操场上躺了半个小时,好了许多.好了,废话不说了,还是写今天的教程吧. 1,html中的换行标签是 br,写法是: <br /> 2,html中有一些特殊的字符 ...
- 设置 Eclipse 智能代码提示,大幅度减少 alt+/ 使用频率,打每个字都出现代码提示的办法
以前网上有个英文版本的,现在自己汉化一下...O(∩_∩)O 哈哈 ~ http://www.cnblogs.com/lidabo/archive/2013/03/05/2944245.html ...
- backgroundworker的使用问题
这几天做项目懒了就用backgroundworker这个控件,觉得它比多线程方便一些,然后这个线程里面在开线程,然后惨剧就发生了:当我打开一个主窗口后,在打开一个子窗口,子窗口里有个backgroun ...
- 在云服务器搭建WordPress博客(六)发布和管理文章
<( ̄︶ ̄)↗[GO!] 发布文章是一个网站后台最重要的功能之一,WordPress的文章发布功能是比较强大的,系统简单地介绍一下. 访问后台 – 文章 – 写文章 ,就可以看到如下图所示的界面 ...
- weiapi2.2 HelpPage自动生成接口说明文档和接口测试功能
在开发Webapi项目时每写完一个方法时,是不是需要添加相应的功能说明和测试案例呢?为了更简单方便的写说明接口文档和接口测试HelpPage提供了一个方便的途径. 她的大致原理是:在编译时会生成.dl ...
- 项目分析(PLUG)
plug过程 .INIT_PLUG #define INIT_PLUG Plug::InitPlug g_InitPlug(true); //共享内存数据结构 struct PlugShareMemo ...
- 转 Eclipse下svn的创建分支/合并/切换使用
最近接项目要求,要在svn主干上创建分支,用分支来进行程序的bug修改,而主干上进行新功能的开发.分支上的bug修改完,发布后,可以合并到主干上.项目程序可以在主干和分支之间进行切换,来实现主干和分支 ...