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语句
异常处理必须严格匹配,不进行任何的类型转换

猜你喜欢

转载自www.cnblogs.com/-glb/p/12013674.html