首页 > 代码库 > 第10课 - C++异常简介

第10课 - C++异常简介

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

  -try语句处理正常代码逻辑

  -catch语句处理异常情况

  -try语句中的异常由对应的catch语句处理

 

    try
    {
        double c = divide(1, 0);

        cout << "c = " << c << endl;
    }
    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处理

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

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

技术分享

 

 fuc3抛出异常,如果fuc3中没有异常处理,则异常传递到fuc2,如果fuc2有异常处理,程序返回继续执行,如果没有异常处理,继续返回fuc3,依次类推,如果最后返回到main函数都还没有处理异常,程序停止运行。

#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 异常
    }

    return ret;
}

void Demo1()
{
    //catch捕获,没有类型转换,必须完全匹配
    try
    {
        throw c;
    }
    catch(int i)
    {
        cout << "catch(int i)" << endl;
    }
    catch(double d)
    {
        cout << "catch(double d)" << endl;
    }
    catch(char c)
    {
        cout << "catch(char c)" << endl;
    }
}

void Demo2()
{
    throw 0.0001; // "D.T.Software";   // const char*
}

int main()
{
    cout << "main() begin" << endl;
    //没有异常,不处理
    try
    {
        double c = divide(1, 1);

        cout << "c = " << c << endl;
    }
    catch(...)
    {
        cout << "Divided by zero..."  << endl;
    }

    Demo1();

    try
    {
        Demo2();
    }
    catch(char* c)
    {
        cout << "catch(char* c)" << endl;
    }
    catch(const char* cc)
    {
        cout << "catch(char* cc)" << endl;
    }
    catch(...)
    {
        cout << "catch(...)" << endl;
    }

    cout << "main() end" << endl;

    return 0;
}

技术分享

技术分享

技术分享

 

第10课 - C++异常简介