如何访问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
相关产品推荐
相关产品推荐

