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

C#结合文件流与数据库操作的异常处理实现咨询

C# 异常处理实现方案

失效原因排查

你之前编写的逻辑不生效主要有三个问题:

  1. 仅在委托内部抛出异常,没有外层try-catch捕获逻辑,未处理的异常会直接导致程序崩溃
  2. int value变量定义在else代码块内部,块外无法访问,本身存在编译语法问题
  3. 缺少前置校验逻辑:没有判断行分割后的数组长度,没有做数值格式合法性校验,异常会在校验代码执行前就触发

实现方案

我们可以根据业务需求选择两种处理策略:遇到错误行直接终止程序并提示,或者跳过错误行继续处理有效数据,以下是覆盖所有你提到的异常场景的完整实现:

前置修改:修正索引查询函数空引用问题

原有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:09:02