CPP(六)异常处理:绝望的沉重感

如果您仅擅长使用C,会感叹C++的异常处理太好用了。熟练运用C++的异常处理,对于程序的可阅读性和健壮性无疑使有利的。

相信您已经熟悉了基本语法,这里不再赘述。

1、系统预定义异常类型(截图来自 C++ Primer 4th Edition)。放在这里备忘。

2、如何理解异常的处理次序?

C++的异常当然也是依赖于操作系统来实现的。对于windows来说,使用SEH来实现异常处理机制,C++就是基于SEH来实现自己的异常处理。

如果您对SEH不很熟悉,可以参考《windows核心编程》一书的相关章节,里面有详细描述。弄明白了之后,您会发现C++的异常处理行为和SEH如出一辙。

我不清楚linux是如何实现异常处理的,请您赐教。


3、效率问题。

据我所知,实践中有些嵌入式项目中是不适用C++的异常处理机制的,原因是其实现的效率无法接受。既然C++的异常处理基于不同的平台有不同的实现,那么其效率应当也是依赖于平台的。

就windows平台而言,C++异常处理在不没有异常发生时是不会对效率产生任何影响的。


4、可以抛出哪些“异常”?

可以抛出任意数据类型,当然也可以抛出任意自定义类千万不要认为自定义异常类必须是exception类的子类或其他特殊类。(如果您精通Java,应当特别注意这一点)


5、标明函数可能抛出的异常。

void a(void) throw(invalid_argument,runtime_error){}

上面的代码表示函数a可以抛出throw括号中的两种异常。

默认情况下运行抛出所有异常,即:

void a(void) throw(...){}

如果希望向调用者承诺不抛出异常,则可以这么写:

void a(void) throw(){}
注意:throw()这种写法也仅仅是保证了当前函数的代码不会向外部抛出exception,却不保证其调用的函数不抛出异常。  

注意:VS截止2014年还不支持这一特性,更准确的说,编译器不检查函数内抛出的异常是否在throw列表中。 


6、什么时候使用异常处理机制

抛出异常的时机:不是万不得已不要将自己的异常抛给别人处理,能够当场处理的就立刻处理。

处理异常的时机:您应当处理别人“万不得已”才抛出的所有异常。



其他、C++的异常检测语法是下面这个样子的,不要和别的语言混淆了哦:

#include <iostream>
using namespace std;

void a(void)
{
	try
	{
		throw invalid_argument("参数错误");
	}
	catch (runtime_error err)
	{
		cout << "运行时刻错误" << err.what() << endl;
	}
}
void b(void)
{
	try
	{
		a();
	}
	catch (invalid_argument ex)
	{
		cout << "参数错误:" << ex.what() << endl;
	}
}
int main(){
	try
	{
		b();
	}
	catch (exception e)
	{
		cout << "未识别类型的异常:" << e.what() << endl;
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值