64_C++中异常处理(上)

1. C++异常处理

  • C++内置了异常处理的语法元素try...catch...
    (1) try 语句处理正常代码逻辑
    (2) catch 语句处理异常情况
    (3) try 语句中的异常有对应的catch语句处理

  • C++通过throw语句抛出异常信息

  • C++异常处理分析
    throw抛出的异常必须被catch处理
    (1) 当前函数能够处理异常,程序继续往下执行
    (2) 当前函数无法处理异常,则函数停止执行,并返回
    (3) 未被处理的异常会顺着函数调用栈向上传播,直到被处理为止,否则程序将停止执行。

编程说明: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 << endl;
    }
    catch(...)
    {
        cout << "Divided by zero ... " << endl;
    }
    
    return 0;
}

输出结果:

Divided by zero ...

2. 深入理解try...catch...

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

3. 异常处理的匹配规则

  • 异常抛出后,至上而下严格匹配每一个catch语句处理的类型。异常处理匹配时,不进行任何的类型转换

编程说明:异常类型匹配

#include <iostream>
#include <string>

using namespace std;

void Demo1()
{
    try
    {
        throw 1;
    }
    catch(char c)
    {
        cout << "catch(char c)" << endl;
    }
    catch(short s)
    {
        cout << "catch(short s)" << endl;
    }
    catch(double d)
    {
        cout << "catch(double d)" << endl;
    }
    catch(int i)
    {
        cout << "catch(int i)" << endl;
    }
    catch(...)
    {
        cout << "catch(...)" << endl;
    }
}

void Demo2()
{
    throw "abcd";
}

int main()
{
    Demo1();
    
    try
    {
        Demo2();
    }
    catch(const char* s)
    {
        cout << "catch(const char* s)" << endl;
    }
    catch(string ss)
    {
        cout << "catch(string ss)" << endl;
    }
        
    return 0;
}

输出结果

catch(int i)
catch(const char* s)

4. 小结

  • C++中直接支持异常处理的概念
  • try...catch...是C++中异常处理的专用语句
  • try语句处理正常代码逻辑,catch语句处理异常情况
  • 同一个try语句可以跟上多个catch语句
  • 异常处理必须严格匹配,不进行任何的类型转换
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容