cpp
#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++异常处理使得异常的引发和异常的处理不必在一个函数中,这样底层的函数可以着重解决具体问题,而不必过多的考虑异常的处理。上层调用者可以在适当的位置设计对不同类型异常的处理。