异常

异常的语法问题

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,异常处理机制博客参考!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值