c++ 异常

2022-11-05  本文已影响0人  arkliu

异常处理

#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;
}

重点异常

上一篇下一篇

猜你喜欢

热点阅读