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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:15:35