异常类
在之前C++简单的异常处理的例子中,我们抛出并捕获了一个int类型的值。但是我们一般采用异常类。因为异常类相比简单的数据类型可以存储更多信息。C++预定义了多个可创建异常对象的异常类,如下图所示。
在所有的异常类中,exception类是根,定义于头文件<exception>中。类中包含一个函数what(),用于返回异常对象的错误信息。
runtime_error类,定义于<stdexcept>中。它是描述运行时错误的标准异常的基类。它的派生类overflow_error描述了算术运算溢出。即一个值太大,超出了C++表示的范围。派生类underflow_error与overflow_error刚好相反。它描述了算术运算向下溢出。即一个值太小,超出了C++的表示范围。
logic_error类,定义于头文件<stdexcept>中,是描述逻辑错误的标准异常类的基类。类invaild_argument描述的是将非法的参数传递给函数的错误。类length_error是对象大小超过最大允许长度的错误。而类out_of_range描述的是值超出允许范围的错误。
类bad_alloc, bad_cast, bad_typeid, bad_exception描述了C++运算符抛出的异常。bad_alloc异常是new运算符在无法分配内存时抛出的。bad_cast是dynamic_cast运算符在转换引用类型发生错误时抛出的。bad_typeid异常时typeid运算符在运算对象为空指针时抛出的。bad_exception类则描述了从未预料的异常出来程序所抛出的异常。
下面给出抛出runtime_error异常的例子:
#include <iostream> #include <stdexcept> using namespace std; int quotient(int a, int b) { if (b == 0) { throw runtime_error("整数不能除零!"); } return a/b; } int main() { cout << "输入两个数:" << endl; int a, b; cin >> a >> b; try{ cout << a << "/" << b << "=" << quotient(a,b) << endl; } catch (runtime_error& e){ cout << e.what() << endl; } return 0; }
输入4和0
再给出一个处理bad_alloc异常的例子:
#include <iostream> using namespace std; int main() { try{ for(int i = 1; i <= 100; i++){ new int[100000000]; cout << i << "个数组被创建了!" << endl; } }catch(bad_alloc& e){ cout << "发生异常:" << e.what() << endl; } return 0; }
运行结果: