深入了解C++异常处理_第1页
深入了解C++异常处理_第2页
深入了解C++异常处理_第3页
深入了解C++异常处理_第4页
深入了解C++异常处理_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第深入了解C++异常处理//某个函数不存在异常,在某个函数后面用throw()描述,表示它不存在异常

voidprint()throw()

cout"当前函数不存在抛出异常操作"endl;

voidprintData()noexcept

cout"c++新标准中的关键字:不存在抛出异常操作"endl;

//throw0;一旦说明没有异常操作,就不能抛出

}

删减符...

任何类型的异常都捕获

不管抛出啥,在哪里抛出的,只要引发异常都可以捕获到

catch(...)

cout"捕获任何类型的异常"endl;

}

异常处理中的传参操作

---可以写一个变量进去

catch(inta)/*隐藏了一个传参操作可以传任何类型,包括自定义类型都可以*/

注意c++中string的处理

/*string类型与constchar*类型区别*/

代码解析:

通过抛出字符串,隐藏了一个传参操作

的理解

intdivisor(inta,intb)

if(b==0)

throwstring("除数不能为0");

returna/b;

intmain()

divisor(1,0);

catch(stringstr)//把throw的内容赋值给strstr="除数不能为0"

coutstrendl;

}

注意string类型与constchar*类型区别

---出现类型不匹配,c++对传参类型要求更严格

intdivisor(inta,intb)

if(b==0)

throw"除数不能为0";//抛出异常解析为char*类型写catch时不能直接当作string

if(b==1)

throw"除数不能为1";/*不同问题的抛出,不能用固定类型(int、char...),可以选择

抛出不同字符串处理string1,string2,string3...通过传

参的方式去描述问题*/

if(b==2)

throwstring("除数不能为2");//需构造无名参数作捕获对象处理---需要自己触发

returna/b;

intmain()

divisor(1,0);//直接触发异常

catch(constchar*str)//抛出的是char*类型,不能当作string

coutstrendl;

divisor(1,2);

catch(stringstr)//如果要捕获string类型,需要自己构造一个string对象返回

coutstrendl;//直接输出str

}

可以抛出自己类的对象

classError

public:

Error(constchar*str="未知错误"):str(str){}

constchar*what()const

returnstr.c_str();

protected:

stringstr;

voidinsertArray(intarray[],int*curNum,intposData,intmaxLength)

if(*curNum=maxLength)//3=3

throwError("数组下标溢出!");

//012

array[*curNum]=posData;//array[3]=3

(*curNum)++;

intmain(){

intarray[3]={0,0,0};

intcurNum=0;

for(inti=0;ii++)

insertArray(array,curNum,i,3);

catch(Errorstr)

coutstr.what()endl;

return0;

}

标准库当中的异常类

#includeexception//父类(基类)

子类很多,子类描述的问题不同而已

例子:constchar*_ptr;一个数据成员,用于描述标准库当中异常的字符串,用字符指针存放那个字符串

what()方法

用于返回数据成员的

1.虚函数

2.不存在异常

return_ptr_ptr:"unknow";判断char*类型的指针是不是为空,不等于空,返回你描述的错误,等于空(由于没有传参),返回未知错误"unknow"

引发标准库中内存申请失败的异常

发现代码出现abort()错误,可以通过这种方式找到,这里是针对内存申请失败做了单一处理,如果不做处理,会直接调用abort函数终止程序

#includeexception

#includeiostream

usingnamespacestd;

classException

public:

Exception(constchar*ptr="UNKNOW"):ptr(const_castchar*(ptr)){}/*构造函数干掉

常属性*/

virtualconstchar*what()const//父类是虚函数且不存在异常

returnptr;

protected:

char*ptr;

//子类继承父类

classBad_alloc:publicException

public:

Bad_alloc(constchar*_Message="badexception"):Exception(_Message){}/*调用父类

的构造函数抛出badexception*/

protected:

//子类继承父类调用父类构造函数

classRun_time:publicException

public:

Run_time(constchar*_Message="run_timeerror"):Exception(_Message){}

protected:

intmain()

try

while(1)

int*p=newint[1024*1024*10];//一直做内存申请,不做释放,最后一定会内存申请失败

catch(bad_allocobject)/*内存申请失败,调用bad_alloc标准库中的异常,创建一个对象接收一

下,子类中的what()方法调用父类中的what()方法打印*/

coutobject.what()endl;

return0;

/*输出*/

badallocation//调用时抛出badallocation是子类对象调用继承下来的what()方法

//一般写代码出现莫名的中断,原因是不做异常处理,引发了abort函数中断程序,一般这种错误都是特殊错误

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论