读书笔记--异常处理(4)

异常说明:
  不能确定函数是否跑出异常及抛出哪种异常,则用异常说明。
void recoup(int) throw(runtine_error);
  空列表指出寒暑不跑出任何异常
void no_problem() throw();
  如果函数跑出了没有异常说明中列出的异常,调用库函数unexpected.默认情况下,unexpected函数调用terminate函数,终止程序
 
异常说明于虚函数:
  基类与派生类中对虚函数异常说明不同,但派生类虚函数的异常说明与对应基类虚函数的异常说明更严格
当使用指向积累类型的指针调用派生类虚函数时,派生类的异常说明不能增加新的可抛出异常。
class Base
{
 public:
  vitual double f1(double) throw();
  vitual int f2(int) throw(logic_error);
  vitual string f3(string) throw(logic_error,runtime_error);
};
calss Derived:public Base
{
 public:
  //error:exception specification is less restrictive tahn Base::f1
  double f1(double) throw(underflow_error);
  //ok:same exception specification as Base::f2
  int f2(int) throw(logic_error);
  //ok:Derived f3 is more restrictive
  string f3() throw();
};

派生类不能在异常说明列表中增加异常,继承层次的用户应该能够编写依赖于说明函数列表的代码,如果通过基类指针或引用进行函数调用,那么类的用户所涉及的应该只是在基类中指定的异常。基类中的异常列表示虚函数的派生类版本可以抛出的异常列表的超集。
void compute(Base *pb) throw()
{
 try()
 {
  pb->f3();
 }
 catch(const logic_error &le){//...}
 catch(const runtime_error &rl){//...}
}


函数指针的异常说明:
void (*pf)(int) throw(runtime_error);
  在另外一个指针初始化带异常说明的函数的指针,或者将后者复制给函数地址的时候,两个指针的异常说明不必相同,但是,源指针的异常说明必须至少与目标指针一样
//ok:recoup is as restrictive as pf1
void recoup(int) throw(runtime_error);

//ok:recoup is more restrictive than pf2
void (*pf1)(int) throw(runtime_error)=recoup;

//ok: recoup is less restrictive than pf3
void (*pf2)(int) throw(runtime_error,logic_error)=recoup;


 
 
 
 
 
 
 
 
 
 
 
 
 
 

你可能感兴趣的:(exception,String,读书,less,Class)