2012-11-06 44 views
4

我有一些抛出XslTransformException的代码。这是所需的行为(XSL包含一个xsl:message元素,其中@terminate设置为yes)。我想在我的代码中捕获这个异常,但找不到包含此异常类的程序集,并且无法在MSDN中找到有关此异常的任何文档以获取合适的继承类(即避免在我的catch块中使用类Exception)。什么程序集是XslTransformException?

我得对System.Xml和Sytem.Xml.Linq组件引用,并具有以下using语句:

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

唯一的例外是System.Xml.Xsl命名空间中;即:

System.Xml.Xsl.XslTransformException 

任何想法我需要参考哪个程序集?

编辑: 按照要求,请看下面的示例代码重现此异常:当我看到在命名空间中没有提到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()); 
      }    
      */ 
     } 
    } 
} 
+0

您是否有一个简短但完整的程序来重现异常,所以我们可以修补?我想知道异常类型是内部的,但是来自外部类型(例如XsltException。) –

+0

不用担心@JonSkeet,请参阅上面的(修订问题)。 – JohnLBevan

+0

JohnLBevan,我想知道为什么你需要知道在哪个程序集中定义了异常,以便捕捉它?这可以通过'try {...} catch()'完成。 –

回答

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被记录下来的结果。

+0

非常感谢@JonSkeet;下次我去装配huntin也是一个很有用的技巧。 – JohnLBevan

0

,System.Xsl其余生活的System.Xml .dll - 您可以在汇编:行中看到on MSDN(我选择名称空间中的第一个类型作为示例),位于Syntax块的上方。

+0

谢谢@DanDaviesBrackett:可惜我有这个程序集在玩,但是这个类似乎活在那个dll以外。 – JohnLBevan

3

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

唯一的例外是internal的,所以你将不能够直接抓住它。它延伸XsltException,所以乔恩Skeet提到,只是赶上XsltException

+0

没有好运 - 我尝试将我的项目更改为** .net 4 **和**。net 4 **客户端配置文件。** C:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0 \ System .Data.SqlXml.dll **&** C: \ Program Files \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0 \ Profile \ Client \ System.Data.SqlXml.dll ** – JohnLBevan

+0

它就在那里。它只是声明为内部的,所以你不能直接捕捉它。我正在用ILSpy看到它。 –

+0

啊,出于某种原因,我认为你不能在外部抛出内部异常,但必须将它们封装在与调用方法相同的异常中。感谢@PabloRomeo。 – JohnLBevan