美文网首页
c++ 异常

c++ 异常

作者: arkliu | 来源:发表于2022-11-05 16:42 被阅读0次

    异常处理

    #include <iostream>
    using namespace std;
    int main()
    {
        double m ,n;
        cin >> m >> n;
        try {
            cout << "before dividing." << endl;
            if( n == 0)
                throw -1; //抛出int类型异常
            else
                cout << m / n << endl;
            cout << "after dividing." << endl;
        } catch(double d) {
            cout << "catch(double) " << d <<  endl;
        } catch(int e) {
            cout << "catch(int) " << e << endl;
        }
        cout << "finished" << endl;
        return 0;
    }
    

    捕获任何异常

    try {
        throw "我抛了一个异常";
    }catch(...) {
        ...
    }
    

    异常声明列表

    void func() throw (int, double, A, B, C){...}
    

    上面的写法表明 func 可能拋出 int 型、double 型以及 A、B、C 三种类型的异常。异常声明列表可以在函数声明时写,也可以在函数定义时写。如果两处都写,则两处应一致。

    void func() throw (); // 声明函数不会抛出议程, c98标准
    

    不会抛出异常

    void func() noexcept; // 声明函数不会抛出议程, c11标准
    

    不会抛出异常

    std::nothrow

    #include <iostream>
    #include<sstream>
    #include<chrono>
    #include<iomanip> // put_time函数需要包含的头文件
    using namespace std;
    
    int main() {
        double * dptr = nullptr;
        try {
            dptr = new double[100000000000000]; // 分配一个很大的堆内存,抛出std::bad_alloc异常
        } catch(std::bad_alloc e) {
            cout <<" 分配内存失败.."<<endl;
        }
    
        // 分配一个很大的堆内存 分配失败不抛出异常
        dptr = new (std::nothrow)double[100000000000000];
        if (dptr != nullptr)
        {
            delete[] dptr;
        }
        return 0;
    }
    

    重点异常

    • std::bad_alloc
      如果内存不足,调用new会产生异常
    • std::bad_cast
      dynamic_cast 可以用于引用,但是c++没有与空指针对应的引用值,如果转换请求不正确,会出现std::bad_cast异常
    • std::bad_typeid
      表达式typeid(*ptr) ,当ptr是空指针时,如果ptr是多态类型,将引发std::bad_typeid

    相关文章

      网友评论

          本文标题:c++ 异常

          本文链接:https://www.haomeiwen.com/subject/kyprtdtx.html