C ++异常处理无法按预期工作

时间:2013-06-20 14:55:55

标签: c++ exception-handling

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

#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逻辑有什么问题?

2 个答案:

答案 0 :(得分:6)

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

对于已检查的访问权限,请改为使用at功能:

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

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

答案 1 :(得分:2)

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

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

例如:

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