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
相关产品推荐
相关产品推荐

