5

我有一些抛出 XslTransformException 的代码。这是所需的行为(XSL 包含一个 xsl:message 元素,其中 @terminate 设置为 yes)。

我试图在我的代码中捕获此异常,但找不到包含此异常类的程序集,并且在 MSDN 中找不到有关此异常的任何文档以了解合适的继承类(即避免使用我的 catch 块中的 Exception 类)。

我引用了 System.Xml 和 Sytem.Xml.Linq 程序集,并具有以下 using 语句:

using System.Xml;
using System.Xml.Xsl;

例外是在 System.Xml.Xsl 命名空间中;IE:

System.Xml.Xsl.XslTransformException

知道我需要参考哪个程序集吗?

编辑: 根据要求,请在下面找到重现此异常的示例代码:

using System;
using System.Xml;
using System.Xml.Xsl;
using System.Text;

namespace StackOverflowDemo
{
    class Program
    {
        static void Main(string[] args)
        {

            XmlDocument xmsl = new XmlDocument();
            xmsl.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?><xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns:msxsl=\"urn:schemas-microsoft-com:xslt\" exclude-result-prefixes=\"msxsl\"><xsl:output method=\"xml\" indent=\"yes\"/><xsl:template match=\"@* | node()\"><xsl:message terminate=\"yes\">this should throw an exception</xsl:message><xsl:copy><xsl:apply-templates select=\"@* | node()\"/></xsl:copy></xsl:template></xsl:stylesheet>");

            XslCompiledTransform xsl = new XslCompiledTransform();
            xsl.Load(xmsl.CreateNavigator());

            XmlDocument xml = new XmlDocument();
            xml.LoadXml("<root />");

            StringBuilder sb = new StringBuilder();
            XmlWriter writer = XmlWriter.Create(sb);
            /*
            try
            {
            */
                xsl.Transform(xml.CreateNavigator(), writer);
            /*
            }
            catch(XslTransformException e) //<-- this class does not exist
            {
                Console.WriteLine(e.ToString());
            }            
            */
        }
    }
}
4

3 回答 3

5

添加以下catch块会显示所有内容:

catch (Exception e)
{
    var t = e.GetType();
    while (t != null)
    {
        Console.WriteLine(t.AssemblyQualifiedName);
        t = t.BaseType;
    }
}

输出:

System.Xml.Xsl.XslTransformException, System.Data.SqlXml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xml.Xsl.XsltException, System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.SystemException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Exception, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

我会忽略这XslTransformException一点 - 你应该抓住它XsltException。毕竟,这XslCompiledTransform.Transform就是记录在案的东西。

于 2012-11-06T17:55:23.237 回答
3

在里面System.Data.SqlXml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

但是,例外是internal,因此您将无法直接捕获它。它扩展XsltException了,所以正如 Jon Skeet 提到的,只是 catch XsltException

于 2012-11-06T17:34:35.630 回答
0

虽然我XslTransformException在命名空间中没有看到对 System.Xsl 的引用,但 System.Xsl 的其余部分存在 System.Xml.dll - 您可以在 MSDN上看到(我选择命名空间中的第一种类型作为示例)在Assembly:行上,就在上面语法块。

于 2012-11-06T17:32:28.640 回答