1)try{}//检查异常;
2)throw //抛出异常,可以为空,可以自定义类型,也可能是系统指定
3)catch(){}捕获异常,可以是确定类型,类型要包含定义,可以使用新变量,或前面已定义过的变量(此处仍要声明);也可以是catch(...)方式
catch(...)代表捕获所有可能的异常,通常放在其他确定性catch_block后,用于捕获任何没有考虑到的异常。catch(...)后的catch_biock属于重复catch,
会导致编译失败。
4)一旦throw,throw后的语句将被跳过,并由catch_block开始继续执行。
5)动态分配内存失败时,系统会默认抛出bad_alloc类型,程序会跳过后面的语句,定位到catch_block进行处理,因此,无法对动态内存分配失败作其他处理
#include<iostream>
using namespace std;
void main()
{
int a=404;
try
{
// int *p = new int[100000000];
int **p = new int*[1000000];
for (int i = 0; i < 1000000; i++)
{
p[i] = new int[10000];
}
if (p == NULL)//这个不会判断,因为内存分配失败后程序会默认抛出类型为bad_alloc的异常,
//抛出异常后程序会跳过后面的语句,定位到catch语句执行。
{
cout << "NULL" << endl;
throw "NULL";
}
else
{
throw a;
cout << "not NULL"<<endl;//这句也不会执行一旦throw,程序自动转到catch语句,
//没有异常一定不要抛出异常。
}
}
catch (int a)
{
cout << a << endl;
}
catch (char *)
{
cout << "NULL" << endl;
}
catch (...)//判断可能没有考虑到的异常语句一定要放在其他确定类型catch语句后,
//在catch(...)后存在的其他catch已在(...)中包含,因此编译器会报错
{
cout << "failed" << endl;
}
}