异常处理
#include <iostream>
using namespace std;
int main()
{
double m ,n;
cin >> m >> n;
try {
cout << "before dividing." << endl;
if( n == 0)
throw -1; //抛出int类型异常
else
cout << m / n << endl;
cout << "after dividing." << endl;
} catch(double d) {
cout << "catch(double) " << d << endl;
} catch(int e) {
cout << "catch(int) " << e << endl;
}
cout << "finished" << endl;
return 0;
}
捕获任何异常
try {
throw "我抛了一个异常";
}catch(...) {
...
}
异常声明列表
void func() throw (int, double, A, B, C){...}
上面的写法表明 func 可能拋出 int 型、double 型以及 A、B、C 三种类型的异常。异常声明列表可以在函数声明时写,也可以在函数定义时写。如果两处都写,则两处应一致。
void func() throw (); // 声明函数不会抛出议程, c98标准
不会抛出异常
void func() noexcept; // 声明函数不会抛出议程, c11标准
不会抛出异常
std::nothrow
#include <iostream>
#include<sstream>
#include<chrono>
#include<iomanip> // put_time函数需要包含的头文件
using namespace std;
int main() {
double * dptr = nullptr;
try {
dptr = new double[100000000000000]; // 分配一个很大的堆内存,抛出std::bad_alloc异常
} catch(std::bad_alloc e) {
cout <<" 分配内存失败.."<<endl;
}
// 分配一个很大的堆内存 分配失败不抛出异常
dptr = new (std::nothrow)double[100000000000000];
if (dptr != nullptr)
{
delete[] dptr;
}
return 0;
}
重点异常
- std::bad_alloc
如果内存不足,调用new会产生异常 - std::bad_cast
dynamic_cast 可以用于引用,但是c++没有与空指针对应的引用值,如果转换请求不正确,会出现std::bad_cast异常 - std::bad_typeid
表达式typeid(*ptr) ,当ptr是空指针时,如果ptr是多态类型,将引发std::bad_typeid
网友评论