zoukankan      html  css  js  c++  java
  • C++中的异常处理(上)

    C++内置了异常处理的语法元素try... catch ...
    -try语句处理正常代码逻辑
    -catch语句处理异常情况
    -try语句中的异常由对应的catch语句处理

    try
    {
      double r = divide(1,0);
    }
    catch(...)
    {
      cout << "Divided by zero..." << endl;
    }

    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;
    }

    C++异常处理分析
    -throw抛出的异常必须被catch处理
      当前函数能够处理异常,程序继续往下执行
      当前函数无法处理异常,则函数停止执行,并返回

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

    当产生异常后,先看function3这个函数有没有能力处理,此时是没有能力处理的。于是function3这个函数就会立即停止执行,并且带着
    异常返回function2的调用点,此时function2也没有能力处理,会立刻停止,并且带着这个异常返回到它的调用点function1中。

    #include <iostream>
    #include <string>
    
    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;
        }
    
        return ret;
    }
    
    int main(int argc, char *argv[])
    {
        try
        {
            double r = divide(1, 0);
    
            cout << "r = " << r << endl;
        }
        catch(...)  
        {
            cout << "Divided by zero..." << endl;
        }
    
        return 0;
    }

    同一个try语句可以跟上多个catch语句
    -catch语句可以定义具体处理的异常类型
    -不同类型的异常由不同的catch语句具体负责
    -try语句中可以抛出任何类型的异常
    -catch(...)用于处理所有类型的异常
    -任何异常都只能被捕获(catch)一次

    异常类型匹配

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    void Demo1()
    {
        try
        {   
            throw 'c';
        }
        catch(char c)
        {
            cout << "catch(char c)" << endl;
        }
        catch(short c)
        {
            cout << "catch(short c)" << endl;
        }
        catch(double c)
        {
            cout << "catch(double c)" << endl;
        }
        catch(...)
        {
            cout << "catch(...)" << endl;
        }
    }
    
    void Demo2()
    {
        throw string("D.T.Software");
    }
    
    int main(int argc, char *argv[])
    {    
        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;
    }

    小结:
    C++中直接支持异常处理的概念
    try...catch...是C++中异常处理的专用语句
    try语句处理正常代码逻辑,catch语句处理异常情况
    同一个try语句可以跟上多个catch语句
    异常处理必须严格匹配,不进行任何的类型转换

  • 相关阅读:
    UVA10891
    UVA10453
    UVA 10201
    UVA10154
    UVA11137
    UVA10617
    UVA10271
    UVA10739
    UVA10306
    节流防抖
  • 原文地址:https://www.cnblogs.com/-glb/p/12013674.html
Copyright © 2011-2022 走看看