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

C#文本文件读取与数据库对比时索引缺失异常处理问询

问题根因分析
  • 原有空引用捕获不生效:你修改zwr函数用了?.空条件运算符和??空合并运算符之后,找不到索引的情况会直接返回0,不会抛出NullReferenceException,所以外层捕获不到,自然不会终止流程
  • 空索引条目出现:文本行拆分后未校验索引有效性,空值、空白符或者不符合格式的行拆分后得到空索引,也会被正常生成WynikPorownania对象加入结果列表
可行解决方案

步骤1:将数据库查询结果转为字典优化查询+校验

替换原有listadb读取逻辑,用字典存储索引和对应值,既提升查询性能,也方便做存在性校验:

// 替换原有的listadb声明及赋值逻辑
Dictionary<string, double> indexDbDict = new Dictionary<string, double>();
double standysp;
string index;
while (myReader.Read())
{
    index = myReader[0].ToString().Trim(); // 提前去除空白避免匹配误差
    standysp = Convert.ToDouble(myReader[1]);
    standysp = standysp < 0 ? 0 : standysp;
    indexDbDict[index] = standysp; // 重复索引直接覆盖,避免脏数据问题
}
myConnection.Close();
Console.WriteLine(indexDbDict.Count);

步骤2:重写zwr函数,无效索引直接抛出异常

double zwr(string myIndex)
{
    // 先校验入参索引是否为空
    if(string.IsNullOrWhiteSpace(myIndex))
        throw new ArgumentException("索引不能为空");
    // 查字典,不存在直接抛异常终止流程
    if(!indexDbDict.TryGetValue(myIndex.Trim(), out double dbValue))
        throw new KeyNotFoundException($"索引【{myIndex}】不存在于数据库中");
    return dbValue;
}

步骤3:文本行处理新增全链路校验

List<WynikPorownania> listatf = File.ReadAllLines(path)
    .Where(line => !string.IsNullOrWhiteSpace(line)) // 先过滤全空行
    .Select(line =>
    {   
        var linia = line.Split("=", StringSplitOptions.RemoveEmptyEntries);
        // 校验格式是否符合「索引=值」要求
        if(linia.Length != 2)
            throw new FormatException($"行【{line}】不符合格式要求,正确格式为:索引=值");
        string index = linia[0].Trim();
        // 校验值是否为合法整数
        if(!int.TryParse(linia[1].Trim(), out int value))
            throw new FormatException($"行【{line}】中的值不是合法整数");
        value = value < 0 ? 0 : value;
        double dbValue = zwr(index);
        return new WynikPorownania { Indeks = index, Ilosc = (int)Math.Max(value, dbValue) };
    }).ToList();

步骤4:外层新增对应异常类型捕获

在原有catch块之后新增以下捕获逻辑,对应新增的异常类型:

catch (ArgumentException ex)
{
    Console.WriteLine("索引校验失败:"+ex.Message);
    return;
}
catch (KeyNotFoundException ex)
{
    Console.WriteLine("索引不存在:"+ex.Message);
    return;
}
效果说明

只要遇到空行、格式错误行、空索引、数据库不存在的索引,都会直接抛出对应异常,被外层捕获后立即终止流程,不会生成无效条目。所有输入均做了Trim处理,避免前后空格导致的偶发匹配失败问题,字典查询相比原有的列表遍历性能提升明显,适合数据量大的场景。

内容的提问来源于stack exchange,提问作者shade999

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:54:06