C++ crash

c++ 异常

abort()

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

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

返回错误码

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

C++ crash_第1张图片
C++ crash_第2张图片

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

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_第3张图片

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

异常规范

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

1341676-20180406232934523-1330792654.png

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

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

栈解退

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

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

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

C++ crash_第4张图片

C++ crash_第5张图片

转载于:https://www.cnblogs.com/simonsqd/p/8729431.html

你可能感兴趣的:(c/c++,java)