【发布时间】:2021-06-26 17:21:57
【问题描述】:
我正在关注 Programming Principles and Practice Using C++ 中的示例代码,其中一个异常示例显示了代码的 sn-p
int main()
{
try {
vector<int> v; // a vector of ints
for (int x; cin >> x; )
v.push_back(x); // set values
for (int i = 0; i <= v.size(); ++i) // print values
cout << "v[" << i << "] == " << v[i] << '\n';
}
catch (const out_of_range& e) {
cerr << "Oops! Range error\n";
return 1;
}
catch (...) { // catch all other exceptions
cerr << "Exception: something went wrong\n";
return 2;
}
}
据我了解,假设捕获 out_of_range 错误并输出 “糟糕!范围错误”。但是,Visual Studio 2019 显示了这一点。
谁能解释一下为什么会显示这个
【问题讨论】:
-
不要将运行时错误与 c++ 异常混淆。当
i是有效索引并且是未定义的行为时,v[i]永远不会引发异常 -
这能回答你的问题吗? stackoverflow.com/questions/16620222/…
-
那么vector越界时会抛出异常吗?
-
没有。
v[i]从不抛出异常,除非i越界,那么它就是 undefined behavior。如果你想要一个例外,你应该改用at(i) -
@AUNG -- 要抛出异常,C++ 代码在使用
[ ]时必须检查向量的边界。通过这样做,代码会变慢,因此程序员会得到他没有要求的东西(边界检查)。依赖速度的关键任务代码将无缘无故减慢速度。如果程序员希望 C++ 检查边界,则使用at()。想象一个游戏程序员说“没有这个边界检查,我的游戏会更快”。如果你是 C++ 程序员,你不会想要这样。
标签: c++ exception visual-c++ try-catch