如何为XmlDocument.LoadXml抛出的异常添加XML字符串信息?
解决方案
方法1:抛出包含XML信息的新异常(推荐)
由于Exception.Message是只读属性无法直接修改,你可以创建新异常,将原异常作为内部异常保留完整调用栈,同时在新异常消息中加入原始XML内容:
public static Information FromString(string xml) { var xmlDocument = new XmlDocument(); try { xmlDocument.LoadXml(xml); } catch (Exception ex) { // 拼接原错误信息与原始XML,保留原异常的调用栈 throw new Exception($"XML解析失败: {ex.Message} | 原始XML: [{xml}]", ex); } // 后续处理逻辑... }
上层捕获异常时,既能看到原错误的完整栈追踪,也能直接获取出错的XML字符串。
方法2:利用Exception.Data字典存储XML
Exception类自带可读写的Data字典属性,可直接附加自定义信息,无需创建新异常:
public static Information FromString(string xml) { var xmlDocument = new XmlDocument(); try { xmlDocument.LoadXml(xml); } catch (Exception ex) { // 将原始XML存入Data字典,键名可自定义 ex.Data.Add("RawXmlContent", xml); // 用throw;保留原始调用栈,不要用throw ex; throw; } // 后续处理逻辑... }
上层捕获异常后,可通过(string)ex.Data["RawXmlContent"]获取出错的XML内容。
方法3:自定义异常类(适合长期复用)
如果项目频繁处理这类XML解析异常,可自定义带原始XML属性的异常类,提升可读性与规范性:
// 自定义异常类 public class XmlParsingException : Exception { public string RawXml { get; } public XmlParsingException(string message, string rawXml, Exception innerException) : base(message, innerException) { RawXml = rawXml; } } // 使用自定义异常 public static Information FromString(string xml) { var xmlDocument = new XmlDocument(); try { xmlDocument.LoadXml(xml); } catch (Exception ex) { throw new XmlParsingException($"XML解析错误: {ex.Message}", xml, ex); } // 后续处理逻辑... }
上层捕获XmlParsingException后,直接通过ex.RawXml即可获取原始XML。
注意事项
- 避免使用
throw ex;,会重置调用栈;用throw;可保留原始异常的栈追踪信息; - 若XML内容过大,建议截取报错位置前后的关键片段,避免异常信息过于臃肿;
- 服务器程序中,带XML信息的异常会被上层全局异常处理捕获(如日志系统、监控告警),满足无界面显示的需求。
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

