C++异常的标准用法
C++标准本身提供的异常类完全能够满足任何规模程序的使用。
其机制如下:
1 exception
a)C++提供了标准异常类exception,这个类是所有标准异常的基类,其析构函数为虚函数
b)提供统一接口 const char* what() const 来作为各种标准异常对外的唯一接口
c)捕获任何标准异常只需要捕获这个类的引用即可捕捉到各种标准异常
d)之所以需要各种异常类型是因为可以在某个局部代码中只捕获某一种派生异常,其他异常留到外面去处理,认为当前地方处理不了。
2 各种标准异常
a)标准异常的构造函数必须提供显示异常类型以及字符串参数作为构造函数的参数
b)也就是说异常发生之后我们只需要catch到这个异常并调用what方法看看发生了什么事情就足够了
c)如果你用字符串作为抛出异常的类型,你只能捕获字符串类型的异常,而不可能是string,也不可能是任何标准异常
d)抛出什么类型就只能捕获什么类型,或者这个类型的基类型。
e)自定义异常类型基本上可以认为是多此一举(在众多工程中管理这个异常类的头文件和源文件不胜其烦),因为我们只需要获取what就可以解决问题
3 标准用法示例代码
void testException(void)
{
try
{
int a = 0;
throw runtime_error("runtime_error");
}
catch (exception& e)
{
cout << "catched:" << e.what() << endl;
}
try
{
int a = 0;
throw logic_error("logic_error");
}
catch (exception& e)
{
cout << "catched:" << e.what() << endl;
}
try
{
int a = 0;
throw "str_error";
}
catch (const exception& e)
{
cout << "catched exception : " << e.what() << endl;
}
catch (const string& e)
{
cout << "catched string : " << e.c_str() << endl;
}
catch (const char* e)
{
cout << "catched const char * :" << e << endl;
}
}