C#结合文件流与数据库操作的异常处理实现咨询
C# 异常处理实现方案
失效原因排查
你之前编写的逻辑不生效主要有三个问题:
- 仅在委托内部抛出异常,没有外层
try-catch捕获逻辑,未处理的异常会直接导致程序崩溃 int value变量定义在else代码块内部,块外无法访问,本身存在编译语法问题- 缺少前置校验逻辑:没有判断行分割后的数组长度,没有做数值格式合法性校验,异常会在校验代码执行前就触发
实现方案
我们可以根据业务需求选择两种处理策略:遇到错误行直接终止程序并提示,或者跳过错误行继续处理有效数据,以下是覆盖所有你提到的异常场景的完整实现:
前置修改:修正索引查询函数空引用问题
原有zwr函数中,如果查询的索引不存在,FirstOrDefault会返回null,直接取standysp会触发空引用异常,先修改该函数:
double zwr(string myIndex) { var item = listadb.FirstOrDefault(x => x.index == myIndex); if(item == null) { // 索引不存在,抛出异常方便定位问题 throw new KeyNotFoundException($"数据库中不存在索引:{myIndex}"); } return item.standysp; }
核心逻辑:文件读取加全场景校验
这里给出跳过错误行继续执行的实现,更符合日常数据处理的需求:
string path = "C:/Users/Praktykant/Documents/textdocs/dok1.txt"; List<WynikPorownania> listatf = new List<WynikPorownania>(); try { // 读取所有行 var allLines = File.ReadAllLines(path); // 判断文件是否为空 if(allLines.Length == 0) { throw new InvalidDataException("目标文本文件内容为空"); } foreach(var line in allLines) { // 跳过空行 if(string.IsNullOrWhiteSpace(line)) continue; // 判断是否包含=分隔符 if(!line.Contains("=")) { Console.WriteLine($"跳过无效行:{line},原因:不含=分隔符"); continue; } var linia = line.Split("="); // 分割后长度不足2的无效行 if(linia.Length < 2) { Console.WriteLine($"跳过无效行:{line},原因:分隔符格式错误"); continue; } string index = linia[0].Trim(); string valueStr = linia[1].Trim(); // 判断数值是否为空 if(string.IsNullOrEmpty(valueStr)) { Console.WriteLine($"跳过无效行:{line},原因:等号右侧数值为空"); continue; } // 判断数值是否为合法整数 if(!int.TryParse(valueStr, out int value)) { Console.WriteLine($"跳过无效行:{line},原因:数值不是合法整数"); continue; } try { // 校验索引是否存在 double standysp = zwr(index); listatf.Add(new WynikPorownania { Indeks = index, Ilosc = (int)Math.Max(value, standysp) }); } catch(KeyNotFoundException ex) { Console.WriteLine($"跳过无效行:{line},原因:{ex.Message}"); } } } catch(FileNotFoundException) { Console.WriteLine("错误:目标文本文件不存在"); return; } catch(UnauthorizedAccessException) { Console.WriteLine("错误:无权限读取目标文本文件"); return; } catch(InvalidDataException ex) { Console.WriteLine($"错误:{ex.Message}"); return; } catch(Exception ex) { Console.WriteLine($"处理文件时发生未知错误:{ex.Message}"); return; }
可选:严格校验模式(遇到错误直接终止)
如果需要严格校验,不允许任何异常数据,只需要把上面的continue全部替换为对应类型的异常抛出语句即可,所有异常都会被外层的try-catch捕获并提示后终止程序。
内容的提问来源于stack exchange,提问作者shade999
相关产品推荐
相关产品推荐

