2012-11-06 93 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