异常关键字:
try:在try部可检测异常
catch:当发现异常捕获处
throw:抛出异常处
noexcept:被修饰函数内部不会发生异常
允许抛出和捕捉各种类型的数据。
cpp
int main()
{
try{
func();
}
catch(const char*e){ //捕捉字符串异常信息
cout<<e<<endl;
}
catch(int g_val){ //捕捉整型异常信息
cout<<g_val<<endl;
}
catch(vector<int> v){//捕捉自定义异常信息
cout<<v.front()<<endl;
}
}
如果没有异常信息没有被catch匹配,就会返回到上级继续匹配。
上级存在匹配,就执行步骤后的代码,func1捕捉异常,从func1开始执行。
如果一直找没有匹配到,直到main函数栈帧也没有被捕捉就会报错
为了防止我们抛出的异常报错,一般都是在异常捕捉最后处使用捕捉任意异常的。
cpp
try
{
func1();
func2();
}
catch(int ){}
catch(float){}
catch(...){}//防止进程退出的最后防线
catch(...){}放到捕捉异常的最后,在前面的catch都异常不匹配的情况下,最后三个点可以捕捉任意的异常。
异常再次抛出。
异常允许多次抛出的。
cpp
void func2()
{
throw "异常信息";
}
void func1()
{
try
{
func2();
}
catch(const char*ptr )
{
throw ptr;
//throw; 得异常到什么抛什么异常
}
catch(...)
{
throw;
}
一般用来堆空间开辟还未析构却抛异常的紧急处理
cpp
void func()
{
int*ptr=new int[10];
try{
func();//可能会出现异常的地方
}
catch(...)
{
delete[] ptr;//如果出现异常将堆申请空间在这里释放,否则内存泄露
throw;//异常再次抛出
}
//其他工作
delete[] ptr;
}