C++中的异常处理机制
C++中的捕获异常机制catch参数中实参的类型不同,采取的处理方式则不相同,且与普通的函数调用还不一样,具体表现为当抛出异常throw A()或throw obj时,对象会进行一次额外的对象复制操作。
测试类实现如下:
#include <iostream> /**
* 测试异常抛出与虚函数
*/
using namespace std; class A {
public:
A() {cout << "A() " << endl;}
~A(){cout << "~A()" << endl;}
A(const A& a){cout << "A(a)" << endl;}
virtual void func(){cout << "A::func()" << endl;}
}; class B:public A {
B() {cout << "B()" << endl;}
B(const B &b) {cout << "B(b)" << endl;}
~B(){cout << "~B()" << endl;}
virtual void func() {cout << "B::func()" << endl;}
};
1) 当采用对象传递方式捕获异常时,在对象中会发生两次复制操作,一次为对象a复制给临时对象,二次为临时对象通过引用方式传递给实参b。
void f1(const A &a)
{
try {
cout << "------ function f1: --------" << endl;
throw a;
} catch( A b) {
cout << "exception A b" << endl;
}
cout << "---- function f1 -------" << endl;
}
该段代码执行结果如下:
------ function f1: --------
A(a)
A(a)
exception A b
~A()
~A()
---- function f1 -------
2) 当采用引用方式捕获异常时,就会少了上面第二次的复制开销,即生成临时对象直接作为参数传递。
void f2(const A &a)
{
try {
cout << "------ function f2: --------" << endl;
throw a;
} catch( const A &b) {
cout << "exception A &b" << endl;
}
cout << "---- function f2 -------" << endl;
}
执行结果如下:
------ function f2: --------
A(a)
exception A &b
~A()
---- function f2 -------
3) 如果直接抛出引用对象,系统会报错,因为异常处理机制不局限于当前函数,有可能在该函数之外。
void f3(const A &a)
{
try {
cout << "------ function f3: --------" << endl;
throw &a;//引用异常,系统会意外终止
} catch(const A &b) {
cout << "exception A &b" << endl;
}
cout << "---- function f3 -------" << endl;
}
4) 抛出异常时,可直接抛出对象,也可生成一个对象,不同的是这样会显式调用构造函数非复制构造函数。
void f4(const A &a)
{
try {
cout << "------ function f4: --------" << endl;
throw A();
} catch(const A &b) {
cout << "exception A &b" << endl;
}
cout << "---- function f4 -------" << endl;
}
执行结果如下:
------ function f4: --------
A()
exception A &b
~A()
---- function f4 -------
5) 在处理带有继承的异常类时,异常处理规则不是按照虚函数继承中”最优匹配(best fit)”原则,而是”最先匹配(first fit)”原则进行处理。
void f5(const B& b)
{
try {
cout << "------ function f5: --------" << endl;
throw b;
} catch(const A &a) {
cout << "exception A &a" << endl;
} catch(const B &b1) {
cout << "exception B &b1" << endl;
} cout << "---- function f5 -------" << endl;
}
该异常会匹配A而非B:
------ function f5: --------
A()
B(b)
exception A &a
~B()
~A()
---- function f5 -------
C++中的异常处理机制的更多相关文章
- .NET中的异常处理机制(一)
1.异常处理的总体指导思想 学习C#中的异常处理机制,大概要了解以下几点: 首先,我们需要知道的事所有具体异常都是继承自System.Exception基类的. 其次,要熟悉FCL类库内置好的一些异常 ...
- 【C++】异常简述(一):C语言中的异常处理机制
人的一生会遇到很多大起大落,尤其是程序员. 程序员写好的程序,论其消亡形式无非三种:无疾而终.自杀.他杀. 当然作为一名程序员,最乐意看到自己写的程序能够无疾而终,因此尽快的学习异常处理机制是非常重要 ...
- 16、java中的异常处理机制
异常:就是程序在运行时出现不正常情况.异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述.并封装成对象. 其实就是java对不正常情况进行描述后的对象体现. 对于问题的划 ...
- java中的异常处理机制
java异常处理机制 1)在java语言中,通常将可能出现异常的语句放入try{}语句中,将出现错误后需要执行的语句放入到catch{}语句中,将无论是否发生异常都要执行的语句放在finally{}语 ...
- 深入理解C++中的异常处理机制
异常处理 增强错误恢复能力是提高代码健壮性的最有力的途径之一,C语言中采用的错误处理方法被认为是紧耦合的,函数的使用者必须在非常靠近函数调用的地方编 写错误处理代码,这样会使得其变得笨拙和难以使用.C ...
- Java 中的异常处理机制
生活中的异常: 不能够完整而顺利的完成一些工作 根据不同的异常进行相应的处理,而不会就此终端我们的生活 引出: 异常处理: 方式: 1.选择结构(逻辑判断)避免 demo:if逻辑处理异常 im ...
- C语言中的异常处理机制
#define try if(!setjmp(Jump_Buffer)) 返回try现场后重新执行判断,所以有两次执行. http://blog.csdn.net/tian_dao_chou_qin/ ...
- Java中的异常处理机制《》
异常机制已经成为判断一门编程语言是否成熟的标准,异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性. Java异常机制主要依赖于try.catch.finall ...
- Java中的异常处理机制的简单原理和应用?
程序运行过程中可能出现各种"非预期"情况,这些非预期情况可能导致程序非正常结束. 为了提高程序的健壮性,Java提供了异常处理机制: try { s1... s2... s3... ...
随机推荐
- (满满的是硬货)Spring深入研究一IOC实现
IOC基于Java底层的反射机制实现 反射机制: 核心: Class cls = Class.forName(类名); Class ptypes[] = new Class[2]; ptypes[0] ...
- C++中的数组越界
C++中数组发生越界错误时, compiling过程不会报错, linking过程也不会报错, 会在executing过程中发生意想不到的错误或问题.
- HTML 中级
abbr(表示它所包含的文本是一个更长的单词或短语的缩写形式): <p>This web site is about <abbr title="HyperText Mark ...
- asp.net自己创建的app_code文件夹中的类不能访问的解决办法
在Web应用程序中不能通过右键项目-〉”添加“-〉”添加ASP.NET文件夹“方式添加 .因为Web应用程序中App_Code就不存在 .不过可以通过手动的方式创建,添加一个文件夹命名为App_Cod ...
- 'scrapyd-deploy' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
在windows上使用scrapyd-client 安装后,并不能使用相应的命令'scrapyd-deploy' 需要在"C:\Python27\Scripts" 目录下 增加sc ...
- centos下在线安装mysql
1 首先查看是否有安装过,如果已经安装过,就不必再安装了 yum list installed mysql* rpm -qa | grep mysql* 2 查看有没有安装包: yum list my ...
- iOS 指定圆角个数
需要实现的效果很明确,只要左上和右上两个地方圆角,以前都是通过layer 直接设置四个角都变成圆角,然后我就开始了强大的搜索功能 然后我就获得了我想要的东西 技术链接:http://www.xuebu ...
- 对客户推荐产品模型+python代码
首先观看数据: l 数据的基本特征用 describe 描述每个基本特征 l 画图画出每个特征的基本统计图 应用import matplotlib.pylab as pl 画图显示 l 关 ...
- CI关于自动加载
/application/config/autoload.php文件中定义自动加载的包.类库.helper.用户配置文件.语言文件.模块 类库会到/application/libraries目录或/s ...
- U盘被写保护如何解除 (转)
U盘被写保护如何解除 在使用U盘的时候,一直都很正常,但是突然有一天,U盘被提示被写保护了,不能够进行读写数据,如果这时正着急使用,一定会被气疯了吧,其实解决这个问题,是非常简单的. U盘被写保护 ...