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

    C++的异常处理中,需要有问题检测部分抛出一个对象给处理代码:通过这个对象的类型和内容,两个部分能够就处了什么错误而进行通信。

Sales_item operator+(const Sales_item &lhs,const Sales_item &rhs)
{

     if( !lhs.same_isbn(rhs) )

{
      throw runtime_error("Data must refer to same ISBN");
 }
 Sales_item ret(lhs);
 ret+=rhs;
 return ret; //return a copy of ret
}

//part of the applicantion that interacts with the user Sales_item item,item1,item2,sum
while( cin >> item1 >> item2 )
{
     try
 {
      sum=item1+item2;  //use sum
 }
 catch(const runtime_error &e)
 {
      cerr << e.what() << "try Again" << endl;
 }
}

被选中的处理代码是调用链中与该对象类型匹配且离抛出一场位置最近的那个
如果抛出一个数组,被抛出的对象转换位置指向数组元素的指针,类似的,如果抛出一个函数,函数被转换为指向该函数的指针。

在处理异常的时候会释放局部存储,所以抛出的对象就不能在局部存储,而用throw表达式初始化一个称为异常对象的特殊对象,异常对象由编译器管理,而且保证驻留在可能被激活的任意catch都可以访问的空间,这个对象由throw创建,并被初始化被抛出的表达式的副本,异常对象将传给对应的catch,并且在完全处理后撤销(被抛出表达式的结构必须是可复制类型)

异常与指针
在抛出表达式静态类型时,对抛出中队指针引用的结果使一个对象,如果指针指向继承层次中的一种类型,指针所指对象的类型就有可能与指针的类型相同,无论对象的实际类型是什么,异常对象的类型都与指针的静态类型相匹配,如果指针是一个指向派生类对象的基类类型指针,则那个对象将被分割,只跑出基类部分
 

你可能感兴趣的:(C++,user,读书,存储,编译器)