欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++ crash

程序员文章站 2022-04-09 21:08:33
c++ 异常 abort() abort() 函数原型在头文件cstdlib中 实现方式是:想标准错误流发送消息abnormal program termination 然后终止程序 返回一个随实现而异的值 也可使用exit() 该函数刷新文件缓冲区 但是不显示消息 返回错误码 一种比异常终止更灵活 ......

c++ 异常

abort()

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

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

返回错误码

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

C++ crash
C++ crash

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

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() 修改最终行为

C++ crash

其他一些技巧:
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()   // 参数表为空,不能抛出异常

异常规范

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

C++ crash

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

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

栈解退

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

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

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

C++ crash

C++ crash