XslTransformException属于哪个程序集?

5
我有一些代码会抛出XslTransformException异常,这是期望的行为(XSL包含一个xsl:message元素,@terminate设置为是)。
我试图在我的代码中捕获此异常,但找不到包含此异常类的程序集,并且无法在MSDN上找到有关此异常的任何文档,以便了解适当的继承类(即避免在catch块中使用Exception类)。
我已经引用了System.Xml和Sytem.Xml.Linq程序集,并具有以下using语句:
using System.Xml;
using System.Xml.Xsl;

例外情况在 System.Xml.Xsl 命名空间中,即:

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());
            }            
            */
        }
    }
}

你是否有一个简短但完整的程序,可以重现异常,以便我们进行调试?我想知道异常类型是否是内部的,但派生自外部类型(例如XsltException)。 - Jon Skeet
没问题,@JonSkeet,请查看上面的(修订后的)问题。 - JohnLBevan
JohnLBevan,我想知道你为什么需要知道异常定义在哪个程序集中才能捕获它?这可以通过 try{...} catch() 来实现。 - Dimitre Novatchev
1
嘿,@DimitreNovatchev。了解汇编的原因是为了在catch语句中引用异常类,从而只捕获该类型的异常(例如,try {...} catch (Exception e) {...}将捕获所有异常-最佳实践要求你尽可能具体地使用catch块,例如try {...} catch(SpecificException e) {...})。这样做的原因是除了您正在处理的异常之外,可能会发生其他异常。您可以捕获异常并实现一个case语句,但这不是正确的方法,所以会导致混淆/应该是最后的选择。 - JohnLBevan
@JohnLBevan,我已经处理异常多年了,从来没有一次需要知道程序集是什么。但确实需要知道异常类的命名空间 - 并且有一个using语句,以便在代码中只使用异常名称。 - Dimitre Novatchev
@DimitreNovatchev 同意您需要一个using语句,但如果您没有对DLL(程序集)的引用,您将无法看到类(在大多数情况下,您也无法看到命名空间,但在这种情况下,命名空间System.Xml.Xsl在程序集System.Data.SqlXml中使用)。如果您创建3个项目,其中1个有异常,1个引用异常项目并抛出此类型的异常,另一个捕获异常并引用抛出项目但不引用异常项目。项目只是程序集的源代码。 - JohnLBevan
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文档中记录的异常。


太好了,谢谢@JonSkeet;这是下次我去寻找汇编代码时的有用技巧。 - JohnLBevan

3

这段代码位于 System.Data.SqlXml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 中。

异常是 internal 的,所以您无法直接捕获它。它扩展了 XsltException,因此像Jon Skeet提到的那样,只需捕获 XsltException


没成功 - 我尝试将我的项目更改为 .net 4.net 4 客户端配置文件。 C:\Program Files\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.Data.SqlXml.dllC:\Program Files\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\Profile\Client\System.Data.SqlXml.dll - JohnLBevan
它在那里。只是声明为内部的,所以你不能直接捕获它。我用ILSpy看到了它。 - Pablo Romeo
啊,出于某种原因,我曾经认为您不能将内部异常抛出到外部,而必须将它们包装在与调用方法相同可用性的异常中。感谢@PabloRomeo。 - JohnLBevan

0

虽然我在命名空间中没有看到关于XslTransformException的参考,但是System.Xsl的其余部分位于System.Xml.dll中 - 您可以在MSDN上查看(我选择了命名空间中的第一个类型作为示例),它在程序集:行上方,就在语法块上面。


谢谢@DanDaviesBrackett:不幸的是,我已经在使用该程序集,但是该类似乎存在于该dll之外。 - JohnLBevan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接