c++异常处理不按预期工作

C++ exception handling not working as expected

本文关键字:工作 异常处理 c++      更新时间:2023-10-16

我试图理解异常处理,我正在测试这个简单的代码:

#include <iostream>
#include <vector>
#include <stdexcept>
using namespace std;
int main()
{
    vector<int> v(4);
    try
    {
        v[v.size()] = 100;
    }
    catch(const exception& e){
        cerr << e.what() << endl;
    }
}

我希望输出是这样的:

Out of Range error: vector::_M_range_check

然而,我得到了相同的错误信息,如果我这样做:
...
vector<int> v(4);
v[v.size()] = 100;
...

也就是通常的"非异常感知"代码。

我的问题是:我正在实现的try catch逻辑有什么问题?

使用下标操作符[]访问向量元素不做范围检查-如果索引超出范围,您将得到未定义的行为。

对于检查访问,使用at函数代替:

v.at(v.size()) = 100;

如果检查失败,这将抛出std::out_of_range, std::exception的子类,您的代码应该捕获它。

问题是您假设std::vector<int>成员operator[]抛出的异常类型派生自std::exception,这可能不是情况,因为标准没有指定operator[]必须执行范围检查或抛出异常。

尝试使用at成员函数来代替范围检查函数,该函数会抛出从std::exception派生的std::out_of_range对象。

例如:

v.at( v.size() ) = 100;