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

如何访问Exception类Data属性中的字典项?

解决Exception.Data属性访问的问题

嘿,我帮你梳理下访问Exception.Data时可能遇到的问题和解决办法~

首先,Exception.Data是一个IDictionary类型的集合,用来存储自定义的异常附加信息,要正确访问它,得先确保你在抛出异常时已经把数据存进去,然后在捕获时安全地取出。

第一步:抛出异常时正确添加数据到Data集合

从你给出的代码片段来看,当ReasonCodeDT.Rows.Count != 1时,你应该是要抛出异常并携带strPracticeID、PracticeName这些信息对吧?那抛出的时候要这样写:

if (ReasonCodeDT.Rows.Count != 1) 
{
    string strPracticeID = PracticeID.ToString();
    // 这里先改下SQL,别用拼接,避免注入风险!
    string PracticeName = getSingleStringResultFromSQL("SELECT PracticeName FROM Practice WHERE PracticeID = @PracticeID", 
        new SqlParameter("@PracticeID", strPracticeID));
    
    // 创建异常并添加数据到Data
    var ex = new Exception($"记录数异常:预期1条,实际{ReasonCodeDT.Rows.Count}条");
    ex.Data.Add("PracticeID", strPracticeID);
    ex.Data.Add("PracticeName", PracticeName);
    ex.Data.Add("RecordCount", ReasonCodeDT.Rows.Count.ToString());
    throw ex;
}

第二步:捕获异常时安全访问Data属性

在catch块里,直接通过键取值可能会抛出KeyNotFoundException,所以推荐用两种安全方式:

方式1:先检查键是否存在

catch (Exception ex)
{
    // 访问PracticeID
    if (ex.Data.Contains("PracticeID"))
    {
        string practiceId = ex.Data["PracticeID"]?.ToString();
        // 你的处理逻辑,比如打印、记录日志
        Console.WriteLine($"PracticeID: {practiceId}");
    }

    // 访问PracticeName
    if (ex.Data.Contains("PracticeName"))
    {
        string practiceName = ex.Data["PracticeName"]?.ToString();
        Console.WriteLine($"PracticeName: {practiceName}");
    }
}

方式2:用TryGetValue更高效

catch (Exception ex)
{
    if (ex.Data.TryGetValue("RecordCount", out object recordCountObj))
    {
        if (int.TryParse(recordCountObj?.ToString(), out int recordCount))
        {
            Console.WriteLine($"实际记录数:{recordCount}");
        }
    }
}

额外提醒:避免SQL注入

你原来的SQL语句是直接拼接字符串的,这很容易被注入攻击,一定要改成参数化查询,就像我上面写的那样,把PracticeID作为参数传入,而不是拼进SQL里。

内容的提问来源于stack exchange,提问作者W.Harr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:52:11