C++ 异常处理

C++ 异常处理 :

什么事异常处理 ?
异常就是在程序运行的过程中出现的一些异常情况,比如除法的除数为0,输入年龄为负数,动态分配内存,空间不够导致无法分配,下标越界,要打开的文件打不开、文件不存在等等都属于异常情况。如果不能及时的处理会导致程序的崩溃,所谓的“处理”就是给出错误的提示信息,然后让程序沿着一条不会出错的路径继续执行下去,也可能是结束这个程序,并且在程序结束之前给出一些必要的措施比如释放内存空间,关闭打开文件等等。

异常处理的基本思想 :
为了对异常进行处理,C++ 中引入了异常处理机制,在某一个函数中发生了异常可以及时的进行处理,抛出错误信息,也可以不进行处理而是只是抛出一个错误的信息,交给函数的调用者(也就是调用这个函数的地方)进行处理,以此类推,如果一层层的函数都不进行异常处理的话,就会最终抛给 main 函数,main 函数中应该进行异常处理,如果不进行,那么程序就会因异常而终止运行。

异常处理的基本语法 :

throw 表达式;
表示抛出一个异常
异常是一个表达式
关注的是表达式值的类型
可以是基本类型,也可以是自定义类型
叫做该种类型的异常,即异常类型

try - catch 块 语法
try {
    语句组;
}
catch (异常类型) {

}
catch 可以有很多个 (如果在函数中可以没有)
在 main 中至少有一个

把 try 括号中的内容叫做trycatch后的叫catchtry - catch 语句的执行过程是
先执行 try 块中的语句
如果没有异常抛出
那么在 try 执行完之后程序直接跳到 最后一个 catch 后
如果在执行的过程中有异常出现
那么抛出这个异常类型 try 块停止运行
catch 块中的异常类型会对这个异常进行 "捕获"
从第一个异常类型进行匹配
如果匹配上就执行这个catch 块的内容
最多只能执行一个 catch 块中的内容
如果都没有匹配上
那么这个函数会结束执行
然后将这个异常抛出给这个函数的调用者
(感觉这个的意思就是异常没有处理之前所有的代码都不会执行,然后从处理完这个的 catch 后开始继续执行,前面的自动跳出忽略)。
有一种 catch 能捕获所有的异常
语法如下 
catch (...) {
    // 语句
}
正是因为这种 catch 可以捕获所有的异常
所以我们把这种异常放在所以catch的最后面

下面举例说明异常的处理
大家可以把试着读读代码 看看代码的执行是否和你想象中的一致。
eg1 :

#include <iostream>

using namespace std;

int main () {
    double m,n;
    cin >> m >> n;
    try {
        cout << "before dividing" << endl;
        if (n == 0) 
            throw -1;
        else if (m == 0) {
            throw -1.0;
        }
        else 
            cout << m / n << endl;
        cout << "after dividing" << endl;
    }
    catch (double d) {
        cout << "catch (double)" << d << endl;
    }
    catch (...) {
        cout << "catch(...)" <<  endl;
    }
    cout << "finished" << endl;
    return 0;
}

eg2:

#include <iostream>
#include <string>

using namespace std;

class CException {
    public :
        string msg;
        CException (string s) : msg (s) {}
};

double Devide (double x,double y) {
    if (y == 0) 
        throw CException ("devided by zero");
    cout << "in Devide" << endl;
    return x / y;
}
int CountTax (int salary) {
    try {
        if (salary < 0) 
            throw -1.0;
            cout << "counting tax" << endl;
    }
    catch (int) {
        cout << "salary < 0" << endl;
    }
    cout << "tax counted" << endl;
    return salary * 0.15;
}

int main () {
    double f = 1.2;
    try {
        CountTax (-1);
        f = Devide (3,0);
        cout << "end of try block" << endl;
    }
    catch (CException e) {
        cout << e.msg << endl;
    }
    catch (...) {
        cout << "wo zhen cong ming" << endl;
    }
    cout << "f=" << f << endl;
    cout << "finished" << endl;
    return 0;
}
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值