C++使用std::map时try..catch无法捕获out_of_range异常问题求助
问题原因
std::map的operator[]本身设计就不会抛出std::out_of_range异常:当你访问的key不存在时,operator[]会自动插入一个对应类型的默认值(int类型默认值为0)到map中,然后返回这个新插入值的引用,你的代码中全程没有触发异常的逻辑,所以catch块永远不会执行。- 你参考的示例应该是使用了容器的
at()接口,只有at()方法在访问越界/不存在的key时才会抛出std::out_of_range异常。
额外提示:不要在只读场景下随意使用
std::map的operator[],它会修改map的内容,如果你没有感知到这个隐式插入行为,可能会带来后续的逻辑bug。
解决方法
可根据你的业务场景二选一:
方案1:使用std::map的at()方法替代operator[]
修改代码如下,即可触发异常被catch捕获:
map<char, int> d; d.insert(pair<char, int>('a', 1)); try { cout << d.at('b'); // 替换为at方法,不存在key时会抛出out_of_range } catch(const std::out_of_range& e){ // 建议加引用避免不必要的对象拷贝 // 执行相关操作 }
该方案适合需要通过异常机制处理不存在key的错误场景。
方案2:先判断key是否存在再操作,不使用异常机制
如果key不存在是常规业务场景而非错误,用find()判断的方案性能更好:
map<char, int> d; d.insert(pair<char, int>('a', 1)); auto it = d.find('b'); if (it != d.end()) { cout << it->second; } else { // 执行key不存在的相关操作 }
内容的提问来源于stack exchange,提问作者AFHAM FARDEEN
相关产品推荐
相关产品推荐

