修复从XPath解析文本分割后转换int的数组越界问题
修复System.IndexOutOfRangeException错误:提取冒号后的数值
报错信息:System.IndexOutOfRangeException: "Index was outside the bounds of the array."
需求:从格式为0:27、0:22的文本中提取冒号后的数字(如27、22)并转换为int类型,当前代码执行时持续报错。
原代码:
var result= int.Parse( (await (await elresult.GetPropertyAsync("textContent")).JsonValueAsync()) .ToString() .Split(":")[1]); // IF time 0 if (result == 0) { await Task.Delay(2000); // Get element elresult = video ? await page.WaitForXPathAsync(@"//*[@id=""root""]/div/div/div/div[1]/div/div[2]/div/div/div[1]/div[4]/span", waitOptions) : // Stream await page.WaitForXPathAsync(@"//*[@id=""root""]/div/div[2]/div/main/div[1]/div[3]/div/div/div[2]/div/div[2]/div/div[3]/div/div/div[1]/div[4]/span", waitOptions); // Video // Get time result = int.Parse( (await (await elresult.GetPropertyAsync("textContent")).JsonValueAsync()) .ToString() .Split(":")[1]); // If time = 0 if (result == 0) { result = 20; } }
问题根源
直接使用Split(":")[1]忽略了两种异常场景:
- 提取到的文本没有冒号,分割后数组仅1个元素,取索引1必然越界
- 文本格式不符合预期(比如冒号在开头/结尾、文本为空)
修复方案
修改代码,增加文本校验、边界判断和安全转换逻辑:
// 提取文本内容并做预处理 var text = (await (await elresult.GetPropertyAsync("textContent")).JsonValueAsync()).ToString().Trim(); int result = 20; // 设置默认值,避免格式异常时无合法值 // 先检查格式合法性,再分割取值 if (text.Contains(":")) { var parts = text.Split(":"); // 确保分割后有足够元素,且能成功转换为int if (parts.Length >= 2 && int.TryParse(parts[1], out var parsedNum)) { result = parsedNum; } } // 处理result为0的情况 if (result == 0) { await Task.Delay(2000); // 重新获取元素 elresult = video ? await page.WaitForXPathAsync(@"//*[@id=""root""]/div/div/div/div[1]/div/div[2]/div/div/div[1]/div[4]/span", waitOptions) : await page.WaitForXPathAsync(@"//*[@id=""root""]/div/div[2]/div/main/div[1]/div[3]/div/div/div[2]/div/div[2]/div/div[3]/div/div/div[1]/div[4]/span", waitOptions); // 重新提取并处理文本 var retryText = (await (await elresult.GetPropertyAsync("textContent")).JsonValueAsync()).ToString().Trim(); if (retryText.Contains(":")) { var retryParts = retryText.Split(":"); if (retryParts.Length >= 2 && int.TryParse(retryParts[1], out var retryParsedNum)) { result = retryParsedNum == 0 ? 20 : retryParsedNum; } } }
关键改进点
- 拆分文本提取逻辑,便于调试和维护
- 用
Contains(":")提前判断格式,避免无效分割 - 用
int.TryParse替代int.Parse,避免转换失败抛出异常 - 分割后先检查数组长度,再访问索引,彻底规避越界错误
- 设置默认值20,确保即使格式异常也有合法返回值
内容的提问来源于stack exchange,提问作者trendbusser
相关产品推荐
相关产品推荐

