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++ 如何处理函数调用和返回?
-----通过将返回地址放在栈中 当函数调用结束 栈弹出继续执行代码的地址