C ++标准库提供了一个专门用于声明要抛出的对象作为异常的基类。它被称为exception,并在命名空间std下的< exception>头文件中定义。这个类有通常的默认和复制构造函数,运算符和析构函数,以及一个额外的虚拟成员函数,称为返回一个空值终止的字符序列(char *),并且可以在派生类中覆盖,以包含某种描述.
// standard exceptions
#include <iostream>
#include <exception>
using namespace std;
class myexception: public exception
{
virtual const char* what() const throw()
{
return "My exception happened";
}
} myex;
int main () {
try
{
throw myex;
}
catch (exception& e)
{
cout << e.what() << endl;
}
return 0;
}
我们已经放置了一个通过引用捕获异常对象的处理程序(注意和符号和类型之后),因此它也捕获从异常派生的类,就像myexex的myex对象一样。
在这里,what() 是异常类提供的一个公共方法,它已被所有子异常类重载。这将返回异常产生的原因
C ++标准库的组件抛出的所有异常都会抛出从此std :: exception类派生的异常。这些是:
异常 | 描述 |
---|---|
std::bad_alloc | 该异常可以通过 new 抛出。 |
std::exception | 该异常是所有标准 C++ 异常的父类。 |
std::bad_typeid | 该异常可以通过 typeid 抛出。 |
ios_base::failure | 该异常可以通过 iostream的库函数抛出 |
例如,如果我们使用操作符 new并且不能分配内存,则抛出类型为bad_alloc的异常:
try
{
int * myarray= new int[1000];
}
catch (bad_alloc&)
{
cout << "Error allocating memory." << endl;
}
建议将所有动态内存分配包含在一个try块中,捕获这种类型的异常以执行一个干净的动作,而不是异常的程序终止,这是当这种类型的异常被抛出并没有被捕获时会发生什么。 如果你想强制执行一个bad_alloc异常来查看它的行为,你可以尝试分配一个巨大的数组; 在我的系统上,试图分配10亿个int,抛出一个bad_alloc异常。
因为bad_alloc是从标准基类异常导出的,所以我们可以通过捕获对异常类的引用来处理同一个异常:
// bad_alloc standard exception
#include <iostream>
#include <exception>
using namespace std;
int main () {
try
{
int* myarray= new int[1000];
}
catch (exception& e)
{
cout << "Standard exception: " << e.what() << endl;
}
return 0;
}