20210728
C-plus-plus
异常处理机制:
在c语言中,异常处理,是通过 if 语句来分条件进行判断
在 C++ 语言中,异常处理,是通过返回一个异常事件对象的方式来表示异常,进行做相应的处理
异常为什么好?
1、函数的返回值可以忽略,但是异常不可忽略,必须进行处理
2、整数返回值没有语义信息,而异常却包含语义信息;(根据异常进行匹配,抛出一个异常对象,根据异常对象的类名就可以判断异常的特点)
3、异常可以调用跳级;假如 func1 调用 func2 ,func2 调用 func 3 ,在func3中出现异常之后,向上进行抛出,在func2中进行处理,或者在func1中进行处理均可
基本语法:
1、在需要抛出异常的位置:throw 对象
2、在调用的位置接收这个异常: try{ }
3、接收到这个异常之后,将异常进行处理: catch(类型 对象名){ } // 对象名接收的就是异常的内容
如果异常抛出到顶层,依然没有内容进行捕获处理,那么这个时候,程序会挂掉,终止执行(调用 terminate):
1、跨函数
2、异常必须处理
栈解旋:
在一个函数中,抛出一个异常,那么此时在这个函数中定义的所有数据类型的对象(不是对象指针)都会自动被析构掉.(在catch处理之前就被释放掉了)
为了加强程序的可读性,可以在函数声明中列出可能抛出异常的所有数据类型
void divid() throw(int , float, char){
}
// 禁止 抛出异常
void divide() throw(){
}
// 可以抛出任何类型的异常
void divide(){
}
catch(className e){
}catch(...){ // 捕获所有异常
}
异常可以抛出: 数字、字符串、自定义类对象
异常对象声明周期:
普通类型元素(异常对象):在异常处理完成(catch块结束之后就释放掉了)
引用类型元素:在异常处理完成(catch块结束之后就释放掉了)
指针类型元素:抛出异常的时候,使用 new MyException() 进行抛出, 在异常处理完成之后 手动 delete 掉即可
编写自己的异常库:所有的异常类的父类都是 exception 类,那么自己的异常类来继承这个 exception 类即可(确保我们自己编写的异常符合C++标准)
1、建议自己的异常类要继承标准异常类
2、重写 父类中的 what 函数和虚析构函数
3、添加拷贝构造函数、等号操作符重载函数
输入输出流:
cout
cin
cerr: 没有缓冲区
clog:有缓冲区