c++异常处理不按预期工作
C++ exception handling not working as expected
我试图理解异常处理,我正在测试这个简单的代码:
#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;
}
}
我希望输出是这样的:
然而,我得到了相同的错误信息,如果我这样做:Out of Range error: vector::_M_range_check
...
vector<int> v(4);
v[v.size()] = 100;
...
也就是通常的"非异常感知"代码。
我的问题是:我正在实现的try catch逻辑有什么问题?
使用下标操作符[]
访问向量元素不做范围检查-如果索引超出范围,您将得到未定义的行为。
对于检查访问,使用at
函数代替:
v.at(v.size()) = 100;
如果检查失败,这将抛出std::out_of_range
, std::exception
的子类,您的代码应该捕获它。
问题是您假设std::vector<int>
成员operator[]
抛出的异常类型派生自std::exception
,这可能不是情况,因为标准没有指定operator[]
必须执行范围检查或抛出异常。
尝试使用at
成员函数来代替范围检查函数,该函数会抛出从std::exception
派生的std::out_of_range
对象。
v.at( v.size() ) = 100;
相关文章:
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Firebase C++VS2018 SDL2-在Firebase::app::create(..)上执行异常处理
- 使用 stoi 功能进行异常处理
- 子系统中的异常处理:本机
- 与异常处理程序中的操作员<<不匹配
- 数组 C++ 上的异常处理程序
- 异常处理:如果用户输入不是三个特定字符之一
- C++ 异常处理错误输出
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- C++交换机状态异常处理
- 在字符串类上的成员函数和out_of_range异常处理
- 奇怪的消息 (_Base_bitset::_M_do_to_ulong) 从溢出异常处理程序中打印出来
- 执行视觉工作室异常处理模式
- 为什么隐式转换在异常处理中从派生到基?
- C++执行期间的类成员函数错误/异常处理
- C++ 中未处理的异常处理程序
- 用户定义的异常处理
- C :ScopeGuard vs返回支票和异常处理
- c++异常处理不按预期工作