zoukankan      html  css  js  c++  java
  • 49、C++的异常处理的方法

    在程序执行过程中,由于程序员的疏忽或是系统资源紧张等因素都有可能导致异常,任何程序都无法保 证绝对的稳定,常见的异常有:

    1.数组下标越界

    2.除法计算时除数为0

    3.动态分配空间时空间不足

    (1)try、throw和catch关键字

    #include <iostream>
    using namespace std;
    int main()
    {
    double m = 1, n = 0;
    try {
    cout << "before dividing." << endl;
    if (n == 0)
    throw - 1; //抛出int型异常
    else if (m == 0)
    throw - 1.0; //拋出 double 型异常
    else
    cout << m / n << endl;
    cout << "after dividing." << endl;
    }
    catch (double d) {
    cout << "catch (double)" << d << endl;
    }
    catch (...) {
    cout << "catch (...)" << endl;
    }
    cout << "finished" << endl;
    return 0;
    }
    代码中,对两个数进行除法计算,其中除数为0。
    可以看到以上三个关键字,程序的执行流程是先执行
    try包裹的语句块,如果执行过程中没有异常发生,
    则不会进入任何catch包裹的语句块,如果发生异
    常,则使用throw进行异常抛出,再由catch进行捕获,
    throw可以抛出各种数据类型的信息,代码中使
    用的是数字,也可以自定义异常class。
    catch根据throw抛出的数据类型进行精确捕获(不会出现类型 转换),
    如果匹配不到就直接报错,
    可以使用catch(...)的方式捕获任何异常(不推荐)。
    当然,如果 catch了异常,当前函数如果不进行处理,
    或者已经处理了想通知上一层的调用者,可以在catch里面再 throw异常。

    (2)函数的异常声明列表
    有时候,程序员在定义函数的时候知道函数可能发生的异常,
    可以在函数声明和定义时,指出所能抛出 异常的列表,写法如下:
    int fun() throw(int,double,A,B,C){...};
    这种写法表名函数可能会抛出int,double型或者A、B、C三种类型的异常,
    如果throw中为空,表明不 会抛出任何异常,如果没有throw则可能抛出任何异常

    (3)C++标准异常类 exception
    C++ 标准库中有一些类代表异常,
    这些类都是从 exception 类派生而来的,如下图所示

    1.bad_typeid:使用typeid运算符,
    如果其操作数是一个多态类的指针,而该指针的值为 NULL,
    则会拋出此异常,例如:
    #include <iostream>
    #include <typeinfo>
    using namespace std;
    class A{
    public:
    virtual ~A();
    };
    using namespace std;
    int main() {
    A* a = NULL;
    try {
    cout << typeid(*a).name() << endl; // Error condition
    }
    catch (bad_typeid){
    cout << "Object is NULL" << endl;
    }
    return 0;
    }
    //运行结果:bject is NULL
    2.bad_cast:在用 dynamic_cast 进行从多态基类对象
    (或引用)到派生类的引用的强制类型转换时,
    如果转换是不安全的,则会拋出此异常
    3.bad_alloc:在用 new 运算符进行动态内存分配时,
    如果没有足够的内存,则会引发此异常
    4.out_of_range:用 vector 或 string的at
    成员函数根据下标访问元素时,如果下标越界,则会拋出此异常
  • 相关阅读:
    opencv下载,安装教程
    VS2010中程序编译生成都是正确的,直接生成的exe也是正确的,就是在VS中运行出现错误
    Oracle11g em启动报此网站的安全证书有问题的解决方案
    Python教程百度云资源分享,全套,完整版!!!
    Python视频教程免费分享(2020年最新版)
    Python 环境搭建(Win 安装以及Mac OS 安装)
    Python学习路线图(2020年最新版)
    Python爬虫入门教程之BeautifulSoup
    Python数据分析练手:分析知乎大V
    python 可变对象与不可变对象
  • 原文地址:https://www.cnblogs.com/crbhf/p/14966628.html
Copyright © 2011-2022 走看看