异常处理
异常处理基础
用try、catch处理异常
#include <iostream>
using namespace std;
int main()
{
double m ,n;
cin >> m >> n;
try {
cout << "before dividing." << endl;
if( n == 0)
throw -1; //抛出整型异常
else if( m == 0 )
throw -1.0; //抛出double型异常
else
cout << m / n << endl;
cout << "after dividing." << endl;
}
catch(double d) {
cout << "catch(double) " << d << endl;
}
catch(...) {
cout << "catch(...) " << endl;
}
cout << "finished" << endl;
return 0;
}
说明
1.在可能发生异常的地方,添加一个try块,并且加入throw语句,在异常发生时抛出异常。
2.若不发生异常,则跳过后续的catch语句,正常执行。
3.若发生异常则立即停止try块的语句,搜寻catch语句并匹配该异常对应的处理语句。
4.若找不到对应的catch处理语句则可能使程序崩溃。
5.catch(...)可能匹配任何异常。
6.异常的匹配是从上到下开始的。
程序运行结果:
<1>
9 0
before dividing
catch(...)
finished
<2>
0 6
before dividing
catch (double) -1
finished
注:
如果一个函数在执行的过程中,抛出的异常在本函数内就被catch块捕获并处理了,那么该异常就不会抛给这个
函数的调用者(也称“上一层的函数”);如果异常在本函数中没被处理,就会被抛给上一层的函数。
标准异常类
常见的几种异常
bad_cast
在用 dynamic_cast进行从多态基类对象(或引用),到派生类的引用的强制类型转换时,如果转换是不安全的,则会
抛出此异常。
见此博客最后一点初探C++强制类型转换
try {
Derived & rd = dynamic_cast<Derived&>(b);
//此转换若不安全,会抛出bad_cast异常
rd.Print();
}
catch (bad_cast& e) {
cerr << e.what() << endl;
}
bad_alloc
在用new运算符进行动态内存分配时,如果没有足够的内存,则会引发此异常。
try {
char * p = new char[0x7fffffff]; //无法分配这么多空间,会抛出异常
}
catch (bad_alloc & e) {
cerr << e.what() << endl;
}
out_of_range
用vector或string的at成员函数根据下标访问元素时,如果下标越界,就会抛出此异常。
vector<int> v(10);
try {
v.at(100)=100; //抛出out_of_range异常
}
catch (out_of_range& e) {
cerr << e.what() << endl;
}