程序中的异常主要分为两种:
1:编译时的异常 ->主要是语法错误,比较容易修改。
2.运行时的异常->程序逻辑错误,运行时(崩溃,或结果异常)。
《抛出异常》
c++的异常处理手机主要有三部分有:try(检查),throw(抛出),catch(捕获)。通常,监测异常情况的程序语句包含在try中,如果try块中发生了异常。则用throw处理。异常由catch捕获,并对异常进行处理。
c++构造函数可以抛出异常。c++标准指明析构函数不能、也不应该抛出异常。
原因:
1,如果析构函数抛出异常,则异常点之后的程序不会扫行,如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏的问题。
2,通常异常发生时,c++的机制调用已经构造对象的析构函数来释放资源,此时若析构函数本身也抛出异常,则前一个异常尚未处理,又有新的异常,会造成程序崩溃的问题。
格式:
try
{
被检查语句
throw 异常
}
catch(异常类型1)
{
进行异常处理的语句1
}
catch(异常类型2)
{
进行异常处理的语句 2
}
捕获异常catch()
例:
#include <iostream>
using namespacestd;
class CExceptionClass
{
private:
char *m_szMessage;
public:
CExceptionClass(constchar *_message)
{
m_szMessage= newchar[strlen(_message)+1];
strcpy(m_szMessage, _message);
}
void show()
{
cout<<m_szMessage<<endl;
}
~ CExceptionClass()
{
delete [] m_szMessage;
}
};
int main(int argc,constchar * argv[])
{
cout<<"主程序开始……"<<endl;
try
{
int nFlag=0;
cout<<"1---------throw int "<<endl;
cout<<"2---------throw char "<<endl;
cout<<"3---------throw char* "<<endl;
cout<<"4---------throw float "<<endl;
cout<<"5---------throw CExeeptionClass "<<endl;
cout<<"Please choose: "<<endl;
cin>>nFlag;
if (nFlag<1||nFlag>5)
{
cout<<"输入错误。"<<endl;
return 0;
}
switch (nFlag)
{
case 1:
throw 100;//抛出的必须是数据,不能是类型。
break;
case 2:
throw 'A';
break;
case 3:
throw "A";
break;
case 4:
throw "100.0ff";
break;
case 5:
throw new CExceptionClass("A");
break;
}
}catch (int)
{
cout<<"catching int"<<endl;
}
catch(char)
{
cout<<"catching char"<<endl;
}
catch (char*)
{
cout<<"catching char *"<<endl;
}
catch(float)
{
cout<<"catching float"<<endl;
}
catch(CExceptionClass *ex)
{
cout<<"catching CExceptionClass"<<endl;
}
catch(...)
{
cout<<"catching any throw"<<endl;
}
cout<<"退出主程序。"<<endl;
return 0;
}