The Labs \ Source Viewer \ SSCLI \ System.Xml \ XmlException

  1. //------------------------------------------------------------------------------
  2. // <copyright file="XmlException.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. namespace System.Xml
  16. {
  17.     using System;
  18.     using System.IO;
  19.     using System.Resources;
  20.     using System.Runtime.Serialization;
  21.     using System.Text;
  22.     using System.Diagnostics;
  23.     using System.Security.Permissions;
  24.     using System.Globalization;
  25.     using System.Threading;
  26.    
  27.     /// <devdoc>
  28.     /// <para>Returns detailed information about the last parse error, including the error
  29.     /// number, line number, character position, and a text description.</para>
  30.     /// </devdoc>
  31.     [Serializable()]
  32.     public class XmlException : SystemException
  33.     {
  34.         string res;
  35.         string[] args;
  36.         // this field is not used, it's here just V1.1 serialization compatibility
  37.         int lineNumber;
  38.         int linePosition;
  39.        
  40.         [OptionalField()]
  41.         string sourceUri;
  42.        
  43.         string message;
  44.        
  45.         protected XmlException(SerializationInfo info, StreamingContext context) : base(info, context)
  46.         {
  47.             res = (string)info.GetValue("res", typeof(string));
  48.             args = (string[])info.GetValue("args", typeof(string[]));
  49.             lineNumber = (int)info.GetValue("lineNumber", typeof(int));
  50.             linePosition = (int)info.GetValue("linePosition", typeof(int));
  51.            
  52.             // deserialize optional members
  53.             sourceUri = string.Empty;
  54.             string version = null;
  55.             foreach (SerializationEntry e in info) {
  56.                 switch (e.Name) {
  57.                     case "sourceUri":
  58.                         sourceUri = (string)e.Value;
  59.                         break;
  60.                     case "version":
  61.                         version = (string)e.Value;
  62.                         break;
  63.                 }
  64.             }
  65.            
  66.             if (version == null) {
  67.                 // deserializing V1 exception
  68.                 message = CreateMessage(res, args, lineNumber, linePosition);
  69.             }
  70.             else {
  71.                 // deserializing V2 or higher exception -> exception message is serialized by the base class (Exception._message)
  72.                 message = null;
  73.             }
  74.         }
  75.        
  76.         [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
  77.         public override void GetObjectData(SerializationInfo info, StreamingContext context)
  78.         {
  79.             base.GetObjectData(info, context);
  80.             info.AddValue("res", res);
  81.             info.AddValue("args", args);
  82.             info.AddValue("lineNumber", lineNumber);
  83.             info.AddValue("linePosition", linePosition);
  84.             info.AddValue("sourceUri", sourceUri);
  85.             info.AddValue("version", "2.0");
  86.         }
  87.        
  88.         //provided to meet the ECMA standards
  89.         public XmlException() : this(null)
  90.         {
  91.         }
  92.        
  93.         //provided to meet the ECMA standards
  94.         public XmlException(string message) : this(message, ((Exception)null), 0, 0)
  95.         {
  96.             #if DEBUG
  97.             Debug.Assert(message == null || !message.StartsWith("Xml_", StringComparison.Ordinal), "Do not pass a resource here!");
  98.             #endif
  99.         }
  100.        
  101.         //provided to meet ECMA standards
  102.         public XmlException(string message, Exception innerException) : this(message, innerException, 0, 0)
  103.         {
  104.         }
  105.        
  106.         //provided to meet ECMA standards
  107.         public XmlException(string message, Exception innerException, int lineNumber, int linePosition) : this(message, innerException, lineNumber, linePosition, null)
  108.         {
  109.         }
  110.        
  111.         internal XmlException(string message, Exception innerException, int lineNumber, int linePosition, string sourceUri) : this((message == null ? Res.Xml_DefaultException : Res.Xml_UserException), new string[] {message}, innerException, lineNumber, linePosition, sourceUri)
  112.         {
  113.         }
  114.        
  115.         internal XmlException(string res, string[] args) : this(res, args, null, 0, 0, null)
  116.         {
  117.         }
  118.        
  119.         internal XmlException(string res, string[] args, string sourceUri) : this(res, args, null, 0, 0, sourceUri)
  120.         {
  121.         }
  122.        
  123.         internal XmlException(string res, string arg) : this(res, new string[] {arg}, null, 0, 0, null)
  124.         {
  125.         }
  126.        
  127.         internal XmlException(string res, string arg, string sourceUri) : this(res, new string[] {arg}, null, 0, 0, sourceUri)
  128.         {
  129.         }
  130.        
  131.         internal XmlException(string res, string arg, IXmlLineInfo lineInfo) : this(res, new string[] {arg}, lineInfo, null)
  132.         {
  133.         }
  134.        
  135.         internal XmlException(string res, string arg, Exception innerException, IXmlLineInfo lineInfo) : this(res, new string[] {arg}, innerException, (lineInfo == null ? 0 : lineInfo.LineNumber), (lineInfo == null ? 0 : lineInfo.LinePosition), null)
  136.         {
  137.         }
  138.        
  139.         internal XmlException(string res, string arg, IXmlLineInfo lineInfo, string sourceUri) : this(res, new string[] {arg}, lineInfo, sourceUri)
  140.         {
  141.         }
  142.        
  143.         internal XmlException(string res, string[] args, IXmlLineInfo lineInfo) : this(res, args, lineInfo, null)
  144.         {
  145.         }
  146.        
  147.         internal XmlException(string res, string[] args, IXmlLineInfo lineInfo, string sourceUri) : this(res, args, null, (lineInfo == null ? 0 : lineInfo.LineNumber), (lineInfo == null ? 0 : lineInfo.LinePosition), sourceUri)
  148.         {
  149.         }
  150.        
  151.         internal XmlException(string res, int lineNumber, int linePosition) : this(res, (string[])null, null, lineNumber, linePosition)
  152.         {
  153.         }
  154.        
  155.         internal XmlException(string res, string arg, int lineNumber, int linePosition) : this(res, new string[] {arg}, null, lineNumber, linePosition, null)
  156.         {
  157.         }
  158.        
  159.         internal XmlException(string res, string arg, int lineNumber, int linePosition, string sourceUri) : this(res, new string[] {arg}, null, lineNumber, linePosition, sourceUri)
  160.         {
  161.         }
  162.        
  163.         internal XmlException(string res, string[] args, int lineNumber, int linePosition) : this(res, args, null, lineNumber, linePosition, null)
  164.         {
  165.         }
  166.        
  167.         internal XmlException(string res, string[] args, int lineNumber, int linePosition, string sourceUri) : this(res, args, null, lineNumber, linePosition, sourceUri)
  168.         {
  169.         }
  170.        
  171.         internal XmlException(string res, string[] args, Exception innerException, int lineNumber, int linePosition) : this(res, args, innerException, lineNumber, linePosition, null)
  172.         {
  173.         }
  174.        
  175.         internal XmlException(string res, string[] args, Exception innerException, int lineNumber, int linePosition, string sourceUri) : base(CreateMessage(res, args, lineNumber, linePosition), innerException)
  176.         {
  177.             HResult = HResults.Xml;
  178.             this.res = res;
  179.             this.args = args;
  180.             this.sourceUri = sourceUri;
  181.             this.lineNumber = lineNumber;
  182.             this.linePosition = linePosition;
  183.         }
  184.        
  185.         private static string CreateMessage(string res, string[] args, int lineNumber, int linePosition)
  186.         {
  187.             try {
  188.                 string message = Res.GetString(res, args);
  189.                
  190.                 if (lineNumber != 0) {
  191.                     string[] msg = new string[2];
  192.                     msg[0] = lineNumber.ToString(CultureInfo.InvariantCulture);
  193.                     msg[1] = linePosition.ToString(CultureInfo.InvariantCulture);
  194.                     message += " " + Res.GetString(Res.Xml_ErrorPosition, msg);
  195.                 }
  196.                 return message;
  197.             }
  198.             catch (MissingManifestResourceException) {
  199.                 return "UNKNOWN(" + res + ")";
  200.             }
  201.         }
  202.        
  203.         static internal string[] BuildCharExceptionStr(char ch)
  204.         {
  205.             string[] aStringList = new string[2];
  206.             if ((int)ch == 0) {
  207.                 aStringList[0] = ".";
  208.             }
  209.             else {
  210.                 aStringList[0] = ch.ToString(CultureInfo.InvariantCulture);
  211.             }
  212.             aStringList[1] = "0x" + ((int)ch).ToString("X2", CultureInfo.InvariantCulture);
  213.             return aStringList;
  214.         }
  215.        
  216.         public int LineNumber {
  217.             get { return this.lineNumber; }
  218.         }
  219.        
  220.         public int LinePosition {
  221.             get { return this.linePosition; }
  222.         }
  223.        
  224.         public string SourceUri {
  225.             get { return this.sourceUri; }
  226.         }
  227.        
  228.         public override string Message {
  229.             get { return (message == null) ? base.Message : message; }
  230.         }
  231.        
  232.         internal string ResString {
  233.             get { return res; }
  234.         }
  235.        
  236.         static internal bool IsCatchableException(Exception e)
  237.         {
  238.             Debug.Assert(e != null, "Unexpected null exception");
  239.             return !(e is StackOverflowException || e is OutOfMemoryException || e is ThreadAbortException || e is ThreadInterruptedException || e is NullReferenceException || e is AccessViolationException);
  240.         }
  241.     }
  242. }
  243. // namespace System.Xml

Developer Fusion