#include <iostream>
#include <string>
using namespace std;// 1.自己准备好一个类,写自己要打印的内容
class MyException{
public:void printE(){cout << "我自己写的异常" << endl;}
};class Students02{
public:Students02(){cout << "默认构造" << endl;}~Students02(){cout << "析构" << endl;}
};int cal(int a, int b){if(b == 0){// throw 1; // 抛出int类型的异常// throw 'a'; // 抛出char类型的异常// throw 1.3; // 抛出double类型的异常// string str = "aaa";// throw str;// 实验一下:析构函数是否会执行Students02 stu1;Students02 stu2;// 从try中的代码开始,到throw抛出异常之前,所有栈上的数据都会被释放// 这个过程叫栈解旋// 抛出自己定义的异常throw MyException(); // 抛出MyException 匿名对象 : 类名()}else{return a / b;}
}void test02()
{int a = 10;int b = 1;// 把下列代码当成 if else 的判断try{ // 把有可能出异常的代码放在这里cal(a, b);}catch(int){ // 捕获异常后的代码throw; // 我这里不处理,让后续异常处理程序处理cout << "int类型的捕获异常"<< endl;}catch(char){ // 捕获异常后的代码cout << "char类型的捕获异常"<< endl;}catch(double){ // 捕获异常后的代码cout << "double类型的捕获异常"<< endl;}catch(MyException e){ // 捕获自己抛出的异常,书写位置不能放在 catch(...)之后e.printE();}catch(...){ // 除了以上几种类型之外,都在这里捕获异常throw; // 我这里不处理,让后续异常处理程序处理cout << "其他类型的异常捕获" << endl;}
}int main()
{// 异常的嵌套 异常的传递如何实现:从内向外传递。务必要有函数处理,否则报错try{test02();}catch(int){cout << "main中的int类型的捕获异常"<< endl;}catch(...){cout << "main中的其他类型的异常捕获" << endl;}return 0;
}
总结:
- 若有异常则通过throw操作创建一个异常对象并抛出。
- 将可能抛出异常的程序段放到try块之中。
- 如果在try段执行期间没有引起异常,那么跟在try后面的catch子句就不会执行。
- catch子句会根据出现的先后顺序被检查,匹配的catch语句捕获并处理异常(或继续抛出异常)
- 如果匹配的处理未找到,则运行函数terminate将自动被调用,其缺省功能调用abort终止程序。
- 处理不了的异常,可以在catch的最后一个分支,使用throw,向上抛。
c++异常处理使得异常的引发和异常的处理不必在一个函数中,这样底层的函数可以着重解决具体问题,而不必过多的考虑异常的处理。上层调用者可以在适当的位置设计对不同类型异常的处理。