异常:当一个函数发现有自己无法处理的情况就会将文提交给它的调用者处理。
void f1(int i)
{
if (i == 3)//当i==3 时,将异常抛出给f();
{
throw "****";//抛出这个对象。
}
}
void f()
{
try{ f1(); }//尝试执行
catch (int i)//捕获列表,捕获的都是临时对象
{
cout << 1;
}
catch (char c)
{
cout << c;
}
catch (const char* str)
{
cout<< str;
throw "asd";//异常再抛出
}
}
int main()
{
try
{
f();
}
catch (...)//可以捕获任意异常,但不清楚类型
{
cout <<”main“;
}
}
捕获匹配原则
先检查throw 是否在try 中,若在则在对应的catch列表中找,若有匹配则进入次catch中处理,若没在try中或没匹配到对应的catch则继续在函数调用栈中寻找。一直找到main函数里,若还没有匹配到,则程序终止。
基类可以捕获派生类
catch(...){} //万能捕获
异常的再抛出
在匹配到某个catch后,此catch块并不能完全解决这个异常,进行一些矫正后继续抛出。
异常的安全
析构函数中使用异常可能会内存泄漏
构造函数中使用异常可能会使初始化对象不完整。
并发环境的异常会造成死锁。
解决方法:捕获后,先释放,再抛出。
RAII
总结
优点:良好的使用可以高效的定位bug。
缺点:程序跳转,难以调试,内存泄漏。