分类: C/C++
2007-09-16 23:27:15
异常处理
语法:
Try{}
Catch()
{}
在函数声明时需要声明该函数可能抛出什么异常,如
void hello() throw(a,b,c)表明可以抛出a、b、c类异常;
void f()表明可以抛出任意异常;
void f() throw()意味着不会抛出异常。
如果实际抛出的异常与我们声明的规格不一致时,需要调用特殊函数unexpected()。使用EXCEPT.H中的set_unexpeted()函数来声明我们自定义处理值,这个函数返回先前的值,我们可以用它来恢复原来的设置。Unexpected指针非空,缺省指向terminated函数。它类似于内存分配错误时的处理函数set_new_handle。
在catch列表中用省略号可以捕获所有异常。重新抛出异常使用不带参数的throw。若任一异常未被捕获,调用terminate终止函数,缺省指向abort。例:析构函数中含有异常抛出或引起异常抛出均为错误。不能在析构函数中抛出异常,否则会导致一些对象无法释放。
运行时类型识别RTTI
1) 用typeid()返回一个typeinfo对象,也可以用于内部类型,当用于非多类时,没有虚函数,用typeid返回的将是基类地址;
2) 动态映射dynamic_cast<类型>(变量)
可以映射到中间级,将派生类映射到任何一个基类,然后在基类之间可以相互映射。
3) 不能对void指针进行映射;
4) Typeid(*p)返回派生类类型;typeid(P)返回基类指针类型;p是指针
Typeid(r)返回派生类类型;typeid(&r)返回基类类型。r是引用;
5) 典型的RTTI是通过在VTABLE中放一个额外的指针实现的。每个新类只产生一个typeinfo实例,额外指针指向typeinfo,typeid返回对它的一个引用;
6) 动态映射dynamic_cast<目标*><源指针>
先恢复源指针的RTTI信息,再取目标的RTTI信息,比较两者是否相同,或者是目标类型的基类;由于它需要检查一长串基类列表,故动态映射的开销比typeid大;
7)四种映射语法:
Static_cast 用于所有良定义转换;
Const_cast 用于映射常量和变量;
Dynamic_cast为了安全类型的向下映射;
Reinterpret_cast 不太安全的机制,它假定对象是一个比特模式,可以被当作完全不同的对象对待;
自动类型转换
对自定义类的转换如:
Class A;
Class B{
Public:
Operate A{}
};