第64课 C++中的异常处理(上)

1、 C++内置的异常处理:try-catch

    1.1、 try 语句处理 正常代码逻辑
    1.2、 catch 语句 处理异常情况
    1.3、 try语句中的异常由对应的catch语句处理,如果对应的catch中 没有处理该异常 ,会自动继续 沿函数调用栈向上被抛出

2、C++通过throw语句抛出异常情况


double divide(double a, double b)
{
    const double delta = 0.000000000000001;
    double ret = 0;

    if( !((-delta < b) && (b < delta)) )
    {
        ret = a / b;
    }
    else
    {
        throw 0; //产生除0异常    }
    return ret;
}

3、C++异常处理分析

    3.1、 throw抛出的异常必须被catch处理
        3.1.1、 当前函数 能够处理异常 ,程序 继续往下执行
        3.1.2、 当前函数 无法处理异常 ,则 函数停止执行,并返回

    3.2、 异常处理的流程: 未被处理的异常会顺着函数调用栈向上传播 ,直到被处理为止,否则程序将停止执行。(PS:如果main函数中都没有处理throw的异常,程序停止)
                    

#include <iostream>
using namespace std;
double divide(double a, double b)
{
    const double delta = 0.0000000000001;
    double ret = 0;
    
    if( !((-delta < b) && (b < delta)) )
    {
        ret = a/b;
    }
    else
    {
        throw 0;    //除0异常时,抛出整数0.,因异常不在该函数处理,会向外层调用函数传递。
    }
    
    return ret;
}
int main()
{
    try
    {
        //除0时由于divide函数抛出异常,而在函数内部那里又没有处理该异常,因此异常被继续抛出,到了main函数中调用函数的代码之处,而在这里异常被try-catch捕获会转向catch语句中,catch处理完后,会直接转向catch语句的后面"return 0;"去执行。而不是转到调用函数的下一行语句(即cout << "r = " << r << endl;)
        double r = divide(1, 0);
        
        cout << "r = " << r << endl;
    }
    catch(...)
    {
        cout << "Divide by zero....." << endl;
    }
    
    return 0;
}


4、多个catch块

    4.1、 catch语句 可以定义捕获具体类型的异常 (如处理int型、double型、自定义类型的异常等)
    4.2、 不同类型的异常由不同的catch语句负责处理
    4.3、 throw可以 抛出任何类型的异常
    4.4、 catch(…)用于处理 所有类型的异常 必须放在所有的catch块之后
    4.5、 任何异常都 只能被捕获(catch)一次

5、异常处理的匹配规则

    5.1、 异常抛出后, 至上而下 严格匹配 每一个catch语句处理的类型。
    5.2、 异常处理匹配时, 不进行任何的类型转换


/****************       异常类型匹配     **********/
#include <iostream>
#include <string>
using namespace std;
void Demo1()
{
    try
    {
        throw 1;//1默认为整型,将从上至下严格匹配各catch,即catch(int c)
                 //如果throw 'c',将匹配catch(char c),注意不进行任何的类型转换!
    }
    catch(char c)
    {
        cout << "catch(char c):" << endl;
    }
      catch(short c)
    {
        cout << "catch(short c):" << c << endl;        
    }
    catch(double c)
    {
        cout << "catch(double c):" << c << endl;        
    }
     catch(int c)
    {
        cout << "catch(int c):" << c << endl;        
    }
     catch(...)  //所有异常,必须放在所有的catch之后,因为是自上而下匹配的
    {
        cout << "catch(...)" << endl;        
    }
}
void Demo2()
{
    throw string("DT.SoftWare!!");
    //throw "DT.SoftWare!!";  //const char *类型,  绝对的匹配,不允许任何的类型转换
}
int main()
{
    //Demo1();
    
    try
    {
        Demo2();
    }
    catch(char* s)
    {
        cout << "catch(char* s):" << endl;
    }
    catch(const char* cs)
    {
        cout << "catch(const char* cs):" << endl;
    }
    catch(string ss)
    {
        cout << "catch(string ss):" << endl;
    }
    
    
    return 0;
}

6、小结

    6.1、 C++中直接支持异常处理的概念
    6.2、 try…catch是C++中异常处理的专用语句
    6.3、 try语句 处理 正常代码逻辑 catch语句 处理异常情况
    6.4、 同一个try语句可以跟上多个catch语句(直到遇上匹配的那个)
    6.5、 异常处理必须 严格匹配 不进行任何的类型转换






























































































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值