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

修复从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:02:29