美文网首页
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