C++语言之crash
小标 2018-07-25 来源 : 阅读 1060 评论 0

摘要:本文主要向大家介绍了C++语言之crash,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。

本文主要向大家介绍了C++语言之crash,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。

c++ 异常

abort()

abort() 函数原型在头文件cstdlib中 实现方式是:想标准错误流发送消息abnormal program termination 然后终止程序 返回一个随实现而异的值

也可使用exit() 该函数刷新文件缓冲区 但是不显示消息

返回错误码

一种比异常终止更灵活的方法是 使用函数的返回值来指出问题


主要目的是避免了错误输入的恶果 让用户继续输入 第三个参数可以是指针或是引用(或是全局变量,但是不推荐)

c++ try_catch

throw语句实际上是跳转语句 ,throw关键字表示引发异常 catch关键字表示捕获异常 try块标识其中特定的异常可能被激活的代码块 后面可以接1..n个catch()

执行throw()语句类似与执行返回语句

可以将对象作为异常类型

    try{

      //程序抛出异常

      throw value;

    }

    catch(valuetype v){

      //例外处理程序段

    }

throw抛出值 catch 接受 throw必须在“try语句块”中才有效

程序接受到throw语句后就会自动调用析构器,把try整体对象clean up 然后进入catch语句 如果在循环体中就会退出循环

这种机制会引起一些致命的错误,比如,当“类”有指针成员变量时(又是指针!),在 “类的构建器”中的throw语句引起的退出,会导致这个指针所指向的对象没有被析构。这里很基础,就不深入了,提示一下,把指针改为类就行了,比如模板类来代替指针,在模板类的内部设置一个析构函数。

语句“throw;”抛出一个无法被捕获的异常,即使是catch(...)也不能捕捉到,这时进入终止函数,见下catch。

一般的catch出现的形式是:

  try{}

  catch(except1&){}

    catch(except2&){}

      catch(...){} //接受所有异常

一般都写成引用(except1&),原因很简单,效率。
问题a:抛出异常,但是catch不到异常怎么办?(注意没有java类似的finally语句)

在catch没有捕获到匹配的异常的时候,会调用默认的终止函数。可以调用set_terminate()来设置终止函数,参数是一个函数指针,类型是:

  void (* terminate)()

到这里,可以题个问题:“没有try-catch,直接在程序中"throw;",会怎么样?”

直接abort() 可以通过set_terminate() 修改最终行为

 

其他一些技巧:
4、try一个函数体,形式如下

  void fun(type1,type2) try----try放在函数体后

  {

    //函数定义

  }

  catch(typeX){}

这个用法的效果就相当于:

    void fun()

    {

      try{函数定义}

    }

throw一个函数体,形式如下:目的是限制函数能够抛出的异常

    void fun (); // 能抛出任何类型的异常

    void fun () throw(except1,except2,except3)

      // 后面括号里面是一个异常参数表,本例中只能抛出这3中异常

    void fun () throw()   // 参数表为空,不能抛出异常

异常规范

以后可能被踢下神坛 但还是要作死样的了解一下

 

作用之一是告诉用户可能需要使用try块 (却也可以直接使用注释解决)

另一个作用是 让编译器添加执行运行阶段检查的代码 检查是否违反了异常规范 (但收效甚微,十分鸡肋 当一个函数调用了其他会引发异常的函数 或者 在编写代码时不会异常 库更新后却会引发异常 )

栈解退

若程序try块中调用了对引发异常的函数进行调用的函数 则程序将从引发异常的函数跳到包含try块和处理程序的函数 这过程涉及到 栈解退

c++ 如何处理函数调用和返回?

-----通过将返回地址放在栈中 当函数调用结束 栈弹出继续执行代码的地址

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程