0

我正在尝试了解异常处理,并且正在测试这个简单的代码:

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

我希望输出类似于:

超出范围错误:vector::_M_range_check

但是,我收到与执行此操作相同的错误消息:

...
vector<int> v(4);
v[v.size()] = 100;
...

也就是说,通常的“非异常感知”代码。

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

4

2 回答 2

6

使用下标运算符[]访问向量元素不会进行范围检查 - 如果索引超出范围,则会出现未定义的行为。

对于检查访问,请改用该at函数:

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

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

于 2013-06-20T14:57:39.593 回答
2

问题是您假设std::vector<int>成员抛出的异常类型operator[]来自std::exception,但情况可能并非如此,因为标准未指定operator[]必须执行范围检查或抛出异常。

尝试使用at成员函数代替范围检查函数,该函数会抛出一个std::out_of_range派生自std::exception.

例如:

v.at( v.size() ) = 100;
于 2013-06-20T14:59:15.040 回答