2

I want something like

try
 {
   //code here
 }
 catch (Exception ex)
  {
    stringXML = Exception.toXML(); 
  }

so that the value of stringXML would be

 <exception><message></message><innerException></innerException></exception>

For example...

How is this possible?

1
  • What is your reason for serializing the exception? To return from a web service? And why serialize to XML? Commented Jul 20, 2009 at 11:35

2 Answers 2

11

It depends how much code you want to write. One simple approach would be to write your own object and use XmlSerializer:

[XmlRoot("exception"), XmLType("exception")]
public class SerializableException {
    [XmlElement("message")]
    public string Message {get;set;}

    [XmlElement("innerException")]
    public SerializableException InnerException {get;set;}
}

and just map a regular exception into this. But since it is simple anyway, maybe XmlWriter is good enough...

public static string GetXmlString(this Exception exception)
{
    if (exception == null) throw new ArgumentNullException("exception");
    StringWriter sw = new StringWriter();
    using (XmlWriter xw = XmlWriter.Create(sw))
    {
        WriteException(xw, "exception", exception);
    }
    return sw.ToString();
}
static void WriteException(XmlWriter writer, string name, Exception exception)
{
    if (exception == null) return;
    writer.WriteStartElement(name);
    writer.WriteElementString("message", exception.Message);
    writer.WriteElementString("source", exception.Source);
    WriteException(writer, "innerException", exception.InnerException);
    writer.WriteEndElement();
}
Sign up to request clarification or add additional context in comments.

2 Comments

What do you mean by "mapping a regular exception into this"?
i.e. create new SerializableException objects to represent each level; but the XmlWriter approach (updated) is probably easier
4

Someone has already wrote a blog entry about it

using System;  
using System.Collections;  
using System.Linq;  
using System.Xml.Linq;  

/// <summary>Represent an Exception as XML data.</summary>  
public class ExceptionXElement : XElement  
{  
    /// <summary>Create an instance of ExceptionXElement.</summary>  
    /// <param name="exception">The Exception to serialize.</param>  
    public ExceptionXElement(Exception exception)  
        : this(exception, false)  
    { }  

    /// <summary>Create an instance of ExceptionXElement.</summary>  
    /// <param name="exception">The Exception to serialize.</param>  
    /// <param name="omitStackTrace">  
    /// Whether or not to serialize the Exception.StackTrace member  
    /// if it's not null.  
    /// </param>  
    public ExceptionXElement(Exception exception, bool omitStackTrace)  
        : base(new Func<XElement>(() =>  
        {  
            // Validate arguments  

            if (exception == null)  
            {  
                throw new ArgumentNullException("exception");  
            }  

            // The root element is the Exception's type  

            XElement root = new XElement  
                (exception.GetType().ToString());  

            if (exception.Message != null)  
            {  
                root.Add(new XElement("Message", exception.Message));  
            }  

            // StackTrace can be null, e.g.:  
            // new ExceptionAsXml(new Exception())  

            if (!omitStackTrace && exception.StackTrace != null)  
            {  
                root.Add  
                (  
                    new XElement("StackTrace",  
                        from frame in exception.StackTrace.Split('\n')  
                        let prettierFrame = frame.Substring(6).Trim()  
                        select new XElement("Frame", prettierFrame))  
                );  
            }  

            // Data is never null; it's empty if there is no data  

            if (exception.Data.Count > 0)  
            {  
                root.Add  
                (  
                    new XElement("Data",  
                        from entry in  
                            exception.Data.Cast<DictionaryEntry>()  
                        let key = entry.Key.ToString()  
                        let value = (entry.Value == null) ?  
                            "null" : entry.Value.ToString()  
                        select new XElement(key, value))  
                );  
            }  

            // Add the InnerException if it exists  

            if (exception.InnerException != null)  
            {  
                root.Add  
                (  
                    new ExceptionXElement  
                        (exception.InnerException, omitStackTrace)  
                );  
            }  

            return root;  
        })())  
    { }  
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.