异常的语法问题
class student
{
public:
student()
{
// 单次new可能失败,这个时候throw
//多次new,可能前面几次都成功申请到空间,但是最后一次失败了,在这个时候throw.
} //上面这两种情况的throw,在处理起来都要解决析构问题,析构几个,析构哪些,以上这些问题,说明处理异常的实现难度。
~student()
{
}//析构抛异常,系统默认接收并给出默认处理,所以析构不throw
}
main()
{
try
{
int n = 0;
n = 3 / n;//c00000094 除0错误
class student;//这里也可能throw
fun1();//这里也可能throw
}//要记录此作用域以内的异常之前的全部生成类的析构函数,然后去析构,
catch(int n) //类型强制匹配;不能隐式转换,throw 1.5会报错
{
}
}
注意:
throw 一定要有catch可以接收,如果没有,在windows平台下系统的abort()会接收到,并给出断言宏
什么情况下写多个try catch:
try{fun1} fun1异常如果不太严重,可以考虑给出警告,程序继续往下运行,在接上try catch语句
try{
try
{
fun1();//如果这里的异常不严重,对程序运行结果影响不大
}
catch()//在这里捕捉异常,并给出错误提示,但是仍然可以往下执行fun2()的程序
{
cout << "xxx Input Erro!" << endl;
}
try
{
fun2();
}
catch()
{
}
}
catch()
{
//在外部这里给出比较严重的系统异常
}
throw 抛的如是是类对象呢?注意拷贝构造问题
析构里面抛异常,不允许
try catch是连体程序块,不允许分割
catch(...) //
void fun1() throw(int, float)//抛出int 和 float 异常
{
//throw 1;
//throw 1.5;
}
void fun2() throw() //不抛任何异常
{
}
void fun3()//会抛任何异常
{
//throw
}
char *p = Null,p[0] =’A’ 以及除0 异常,在vc++2013 需要编译器额外设置 (设置C++),才能捕获异常。默认异常处理机制
异常的设计问题:
class Math
{
int Div(int n1, int n2)
{
if( n2 == 0 )
{
throw 1;
}
return n1 / n2;
}
int mult()
{
result = n1 * n2;
if( n1 > 0 && n2 > 0 && result < 0)
{
throw 2;
throw "Erro:discribe";
//不利于解析
// 考虑throw 异常类,并在类中给成员函数及数据成员记录相关异常来源相关信息,可以查看详细错误信息
}
return result
}
目前较好的异常错误设计思路:
catch(基类引用)//接受派生类的,在基类给虚函数,派生类强制实现自己的虚函数给出错误信息提示,基类指针也可以,但是需要使用 new 派生类,需要解决额外的delete问题,
ps:catch函数中可以把错误信息写入文件,保存起来,日志调查
catch(具体派生类引用)//简单错误,单独处理
{}
catch(基类引用)//编译器会自动延长 抛出引用方式的类的生命周期
{}
catch(...)
{}
每个错误异常一个类,别人写好的类(overflow,zeroflow…);
别人抛的异常,c++没写catch时候,编译器不会报错,所以写程序的时候要错误,这点不太合理,现在很多语言这种情况都会报错。
安卓平台基本都是用catch模式
http://blog.chinaunix.net/uid-26874207-id-4128326.html,异常处理机制博客参考!