我正在尝试理解异常处理,我正在测试这个简单的代码:
#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逻辑有什么问题?
答案 0 :(得分:6)
使用下标运算符[]
来访问向量元素不会进行范围检查 - 如果索引超出范围,则会得到未定义的行为。
对于已检查的访问权限,请改为使用at
功能:
v.at(v.size()) = 100;
如果检查失败,则会抛出std::out_of_range
,std::exception
的子类,您的代码应该捕获它。
答案 1 :(得分:2)
问题在于您假设std::vector<int>
成员operator[]
抛出的异常类型来自std::exception
,但可能并非如此,因为标准未指定operator[]
必须执行范围检查或抛出异常。
尝试使用at
成员函数代替范围检查函数,该函数抛出从std::out_of_range
派生的std::exception
对象。
例如:
v.at( v.size() ) = 100;