C++ 异常处理(二)

异常处理的一个特性为:

引发异常时编译器总是创建一个临时拷贝,即使异常规范与catch块中指定的是引用。

伪代码:

class problem { ... };
...
void super() throw (problem)
{
	...
	if (oh_no)
	{
		problem oops; //construct object
		throw oops;   // throw it
		...
	}
	...
}
...
try{
	super();
}
catch (problem& p) //引用
{
	...
}

这里p指向的是oops的副本,而不是oops本身,

原因:函数super()执行完,oops不复存在。

但既然throw生成了副本,何必还用引用呢?

原因:引用还有一个重要特性,基类引用可以执行派生类对象。

假设有一组通过继承关联的异常类型,则在异常规范中只需列出一个基类引用,它将与任何派生类对象匹配。


关于异常类层次结构:

伪代码:

class bad_1 { ... };
class bad_2 : public bad_1 { ... };
class bad_3 : public bad_2 { ... };
...
void test_ex()
{
	...
	if (a)
		throw bad_1();
	if (b)
		throw bad_2();
	if (c)
		throw bad_3();
	...
}
...
try{
	test_ex();
}
catch(bad_3& be)
{
	...
}
catch(bad_2& be)
{
	...
}
catch(bad_1& be)
{
	...
}
如果将bad_1&处理程序放在最前面,它将捕获异常bad_1,bad_2,bad_3;

通过按相反的顺序排列,bad_3异常将被bad_3&处理程序捕获。


假如有一个调用了另一个函数的函数,不知道被调用的函数可能引发哪些异常,

在这种不知道异常类型的情况下,也能捕获异常,方法是用省略号来表示异常类型。

catch( ... )
{
	// ...
}

try{
	test_ex();
}
catch(bad_3& be)
{
	...
}
catch(bad_2& be)
{
	...
}
catch( ... ) // catch whatever is left
{
	// ...
}







  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值