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.0000000000001;
    double ret = 0;
    
    if( !((-delta < b) && (b < delta)) )
    {
        ret = a / b;
    }
    else
    {
        throw 0;        // 产生除 0 异常
    }
    
    return ret;
}
  • C++ 异常处理分析

    • throw 抛出的异常必须被 catch 处理

      • 当前函数能够处理异常,程序继续向下运行
      • 当前函数无法处理异常,则函数停止执行,并返回

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

clipboard.png

编程实验: C++ 异常处理初探

#include <iostream>
#include <string>
using namespace std;

double divide(double a, double b)
{
    const double delta = 0.00000000000001;
    double ret = 0;
    
    if( !((-delta < b) && (b < delta)) )
    {
        ret = a / b;
    }
    else
    {
        throw 0;
    }
    
    return ret;
}

int main()
{
    try
    {
        double r = divide(1, 0);
    
        cout << "r = " << r << endl;
    }
    catch(...)
    {
        cout << "Divided by zero ..." << endl;
    }
    
    return 0;
}
输出:
Divided by zero ...
  • 同一个 try 语句可以跟上多个 catch 语句

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

  • 异常处理的匹配规则

clipboard.png

编程实验: 异常类型匹配

#include <iostream>
#include <string>
using namespace std;

void Demo1()
{
    try
    {
        throw 'c';
    }
    catch(short c)
    {
        cout << "catch(short c)" << endl;
    }
    catch(int c)
    {
        cout << "catch(int c)" << endl;
    }
    catch(char c)
    {
        cout << "catch(char c)" << endl;
    }
    catch(...)
    {
        cout << "catch(...)" << endl;
    }
}

void Demo2()
{
    throw "D.T.Software";
}

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;
    }
    catch(...)
    {
        cout << "..." << endl;
    }
    
    return 0;
}
输出:
catch(char c)
catch(const char* cs)

小结

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

以上内容参考狄泰软件学院系列课程,请大家保护原创


TianSong
734 声望138 粉丝

阿里山神木的种子在3000年前已经埋下,今天不过是看到当年注定的结果,为了未来的自己,今天就埋下一颗好种子吧