捕获异常后循环中断问题排查:为何i=-1时循环终止且sum为0?
问题原因分析
1. 循环直接终止的核心原因:类型不匹配的隐式转换
vec.size()返回的是无符号整数类型size_t,而循环变量i是有符号的int类型。当i=-1时,会被隐式转换成size_t类型——按照C++规则,有符号负数转无符号会变成该无符号类型的最大值(比如64位系统下是18446744073709551615)。此时i < vec.size()的判断就变成了「这个极大的正数 < 5」,结果为false,循环根本没进入就直接结束了,所以sum一直是初始值0。
2. 异常处理逻辑完全错误
就算循环能执行,代码的异常处理也达不到预期:
vec.at(i)在索引越界时,会直接抛出std::out_of_range类型的异常,根本不会返回任何int值。原代码里的throw vec.at(i)语句永远没机会执行——因为vec.at(-1)执行的瞬间就已经抛出异常了。- 原代码的
catch(int x)分支根本捕获不到索引越界的异常,只有catch(...)能接住,但因为循环没启动,这部分逻辑完全没触发。
简单修正示例
如果要实现「累加所有元素值,同时捕获索引越界异常」的逻辑,可以这么改:
#include <bits/stdc++.h> using namespace std; int main() { vector<int> vec{0, 1, 2, 3, 4}; int sum = 0; // 统一循环条件的类型,避免隐式转换问题 for (int i = 0; i < static_cast<int>(vec.size()); i++) { try { sum += vec.at(i); // 直接访问元素,越界时自动抛异常 } catch (const out_of_range& e) { cout << "Exception Handled: " << e.what() << endl; } } cout << sum << endl; return 0; }
内容的提问来源于stack exchange,提问作者munsoft004
相关产品推荐
相关产品推荐

