在Stroustrup的书中,第5章练习有一个小程序,您可以在其中插入具有有目的错误的选择,以便更好地理解错误处理。插入内容之一如下:
vector<char> v(5); for (int i=0; i<=v.size(); ++i) ; cout << "Success!\n";
放置在较大的代码中,如下所示:
#include "std_lib_facilities.h"
int main()
try {
vector<char> v(5);
for (int i=0; i<=v.size(); ++i) ;
cout << "Success!\n";
return 0;
}
catch (exception& e){
cerr<<"error: "<<e.what()<<'\n';
return 1;
}
catch (...){
cerr<<"Oops: unknown exception!\n";
return 2;
}
我可以修复代码。要解决此问题,我删除了for语句中间的不正确的分号,并且表面上将更改为for语句中的<=到<运算符,以免导致范围错误。这将编译并打印5个“成功!”。到终端。
问题是,如果我修改程序以保留范围错误以了解如何处理该错误,那么我仍然不会遇到异常。例如,如果我只是删除分号并保留<=不变,它将显示“成功!”。 6次如果我甚至对i <= v.size()+ 10都这样做,它仍然会打印出“成功!”。多次。
我对Stroustrup的理解是,不应该这样处理。它应该引发异常,因为<=使其读取向量v的6个索引,而第6个索引应超出范围。
有人可以帮助我理解为什么该程序 not 引发范围错误而 not 出现异常的问题吗?
我在全新安装的Ubuntu 18.04上将g ++用作编译器,该安装是出于明确学习代码的目的而安装的。没有使用特殊的编译器参数。只是“ g ++ -o名称CODE.cpp”。