You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

捕获异常后循环中断问题排查:为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:28:32