大胖的部落格

Just a note

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  112 随笔 :: 0 文章 :: 3 评论 :: 0 Trackbacks

异常类
class BaseEx
{
public:
    
virtual void print()
    
{
        cout
<<"Base print"<<endl;
    }

}
;

class DerivedEx:public BaseEx
{
public:
    
void print() 
    
{
        cout
<<"Derived print"<<endl;
    }

}
;


父类型的异常
BaseEx *= &DerivedEx();   //父类型指针指向子类对象

try
{
    
if(1)
    
{
        
throw *p;    //抛出父类型异常
    }

}

catch(DerivedEx)    //子类型的catch无法捕获父类型异常
{
    cout
<<"catch"<<endl;
}

catch(BaseEx )    //父类型的catch捕获父类型异常
{
    cout
<<"catch"<<endl;
}

rethrow
重新抛出的异常类型和之前抛出的类型一致,与throw所在catch子句所catch的异常类型无关。
try
{
    
try
    
{
        
if(1)
        
{
            
throw DerivedEx();    //抛出子类型异常
        }

    }

    
catch(BaseEx)    //捕获父类型异常
    {
        cout
<<"catch"<<endl;
        
throw;        //重新抛出
    }

}

catch(DerivedEx)    //捕获子类型对象
{
    cout
<<"recatch by derived type"<<endl;
}



异常与虚函数
catch子句的异常类型如果为对象,则无法体现虚函数特性,引用则可以。
try
{
    
try
    
{
        
if(1)
        
{
            
throw DerivedEx();    //抛出子类异常
        }

    }

    
catch(BaseEx e)    //捕获父类型异常,创建异常对象
    {
        e.print();    
//调用父类方法,因为e是父类对象
        throw;        //重新抛出
    }

}

catch(BaseEx &e)    //捕获父类型异常对象,异常引用
{
    e.print();        
//调用子类方法,因为e是引用,实际对象为子类对象
}

throw在抛出异常对象进行拷贝时,调用的是对象静态类型所对应的类的拷贝构造函数:
try
{
    
try
    
{
        
if(1)
        
{
            
throw DerivedEx();    //抛出子类异常
        }

    }

    
catch(BaseEx &e)    //捕获父类型异常引用,不创建异常对象
    {
        e.print();    
//调用子类方法,因为e引用的是子类对象
        throw e;      //重新抛出,调用父类的拷贝构造函数,因为对象的静态类型是BaseEx
    }

}

catch(BaseEx &e)    //捕获父类型异常对象,e引用的是上面创建的父类对象
{
    e.print();        
//调用父类方法
}


    
return 0;
}


栈展开和析构函数调用
在Test()带着这个未处理的异常退出之前,栈展开过程会销毁Test()中所有在抛出异常之前被创建的局部类对象,以防止内存泄漏。
void Test()
{
    Source s;

    
throw TestExcep();
}



异常规范
基类中虚拟函数的异常规范可以与派生类改写的成员函数的异常规范不同。
但是派生类虚拟函数的异常规范必须与基类虚拟函数的异常规范一样或者更严格。
posted on 2009-05-10 16:00 大胖 阅读(283) 评论(0)  编辑 收藏 引用 所属分类: C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理