• 第六十四课、c++中的异常处理(上)


     一 、c++的异常处理

    1、c++内置了异常处理语法元素try...catch

    (1)、try语句处理正常逻辑代码

    (2)、catch处理异常情况

    (3)、try语句中的异常由对应的catch语句处理

    2、c++通过throw语句抛出异常信息

     3、c++异常处理分析

    (1)、throw抛出的异常必须被catch处理(否则有异常时运行发生错误

    A、当前函数能处理异常,程序继续往下执行

    B、当前函数无法处理异常,则函数停止执行,并返回

    C、未被处理的异常会顺着函数调用栈向上传播,直到被处理为止,否则程序将停止执行

     

    #include <iostream>
    
    using namespace std;
    
    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异常时,抛出整数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、同一个try语句可以跟上多个catch语句

    (1)、catch语句可以定义具体处理的异常类型

    (2)、不同类型的异常由不同的catch语句负责处理

    (3)、try语句可以抛出任何类型的异常

    (4)、catch(...)用于处理所有类型的异常(多个catch语句时,catch(...)要放在最后

    (5)、任何类型的异常都只能被捕获(catch)一次

    5、异常处理的规则

    (1)、异常抛出后,自上而下严格匹配每一个catch语句处理类型

    (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):" << 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 "SantaClaus"; //const char*类型
        //throw string("SantaClaus"); //string类型
    }
    
    int main()
    {    
        Demo1(); 
    
        try
        {
           Demo2(); 
        }
        catch(char* s)
        {
            cout << "catch(char* s):" << s << endl;
        }
        catch(const char* s)
        {
            cout << "catch(const char* s):" << s << endl;
        }
        catch(string s)
        {
            cout << "catch(string s):" << s << endl;
        }   
        
        return 0;
    }
    /*输出结果:
    catch(int c):1
    catch(const char* s):SantaClaus
    */

    二、小结

    (1)、c++直接支持异常处理的概念

    (2)、try...catch...是c++中异常处理的专用语句

    (3)、try语句处理正常逻辑的代码,catch处理异常情况

    (4)、同一个try语句可以跟上多个catch语句

    (5)、异常处理必须严格匹配,不进行任何类型的转换

  • 相关阅读:
    nodejs使用nodemailer发送邮件
    nodemaierl以hotmail(微软邮箱)作为发件人时报错554 5.2.0 STOREDRV.Submission.Exception: OutboundSpamException;
    react 项目部署nginx 配置问题(部署在子目录下)
    nodejs之glob与globby
    package-lock.json的作用
    webpack搭建项目流程(纯干货)
    JS-数组遍历中删除元素的方法优化
    递归tree结构的数据(修改antd tree结构的数据)
    【原创】如何优雅的转换Bean对象
    【解决方案】mysql大数据删除
  • 原文地址:https://www.cnblogs.com/gui-lin/p/6381604.html
Copyright © 2020-2023  润新知