C#循环处理日志报Index was outside the bounds of the array错误
报错根因
你的代码触发数组索引越界,核心有3个问题:
- 遍历逻辑缺陷:使用
foreach遍历日志数组时,没有维护当前行的索引变量index,代码里直接引用未正确赋值的index做计算,初始值不可控。 - 索引偏移错误:需求要求检查ERROR行的下一行(索引为
index+1)是否包含at,但你的代码直接计算到descNb = index + 3的位置,索引偏移完全不符合预期。 - 缺少边界判断:所有读取
logs[descNb]的操作,都没有提前判断descNb是否超出数组最大索引(数组最大索引为logs.Length - 1);尤其是while循环内先执行descNb++再读取数组内容,只要ERROR行出现在日志末尾附近,后续没有足够行数时,就会直接触发越界异常。
符合需求的正确实现
// 日志数组为空时直接返回,避免后续异常 if (logs == null || logs.Length == 0) { return; } for (int lineIndex = 0; lineIndex < logs.Length; lineIndex++) { string currentLogLine = logs[lineIndex]; if (currentLogLine.Contains("ERROR")) { string checkDescr = string.Empty; int checkIndex = lineIndex + 1; // 先判断下一行是否存在、且包含" at ",符合条件才进入追加逻辑 if (checkIndex < logs.Length && logs[checkIndex].Contains(" at ")) { // 循环条件先判断索引合法,再判断内容匹配,避免越界 while (checkIndex < logs.Length && logs[checkIndex].Contains(" at ")) { checkDescr += logs[checkIndex]; checkIndex++; } } // 此处checkDescr即为当前ERROR对应的所有堆栈跟踪内容,可按需做后续处理 } }
关键修复说明
- 改用
for循环遍历,直接通过循环变量获取当前行的准确索引,不存在索引丢失问题 - 所有数组访问操作前,都先校验索引是否在合法范围内,从根源上杜绝索引越界
- 对齐需求逻辑:从ERROR行的下一行开始检查,没有多余的索引偏移
- 调整循环判断顺序:先校验索引合法性、内容匹配度,再执行追加和索引自增,不会出现索引超出范围后再读数组的问题
内容的提问来源于stack exchange,提问作者feperc
相关产品推荐
相关产品推荐

