如果您仅擅长使用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;
}