Search code examples
c#.netexceptiontostring

.NET: How to convert Exception to string?


When an exception is thrown (while debugging in the IDE), i have the opportunity to view details of the exception:

enter image description here

But in code if i call exception.ToString() i do not get to see those useful details:

System.Data.SqlClient.SqlException (0x80131904): Could not find stored procedure 'FetchActiveUsers'.
  [...snip stack trace...]

But Visual Studio has some magic where it can copy the exception to the clipboard:

enter image description here

Which gives the useful details:

System.Data.SqlClient.SqlException was unhandled by user code
  Message=Could not find stored procedure 'FetchActiveUsers'.
  Source=.Net SqlClient Data Provider
  ErrorCode=-2146232060
  Class=16
  LineNumber=1
  Number=2812
  Procedure=""
  Server=vader
  State=62
  StackTrace:
       [...snip stack trace...]
  InnerException:

Well i want that!

What would be the contents of:

String ExceptionToString(Exception ex)
{ 
    //todo: Write useful routine
    return ex.ToString();
}

that can accomplish the same magic. Is there a .NET function built in somewhere? Does Exception have a secret method somewhere to convert it to a string?


Solution

  • ErrorCode is specific to ExternalException, not Exception and LineNumber and Number are specific to SqlException, not Exception. Therefore, the only way to get these properties from a general extension method on Exception is to use reflection to iterate over all of the public properties.

    So you'll have to say something like:

    public static string GetExceptionDetails(this Exception exception) {
        var properties = exception.GetType()
                                .GetProperties();
        var fields = properties
                         .Select(property => new { 
                             Name = property.Name,
                             Value = property.GetValue(exception, null)
                         })
                         .Select(x => String.Format(
                             "{0} = {1}",
                             x.Name,
                             x.Value != null ? x.Value.ToString() : String.Empty
                         ));
        return String.Join("\n", fields);
    }
    

    (Not tested for compliation issues.)

    .NET 2.0 compatible answer:

    public static string GetExceptionDetails(this Exception exception) 
    {
        PropertyInfo[] properties = exception.GetType()
                                .GetProperties();
        List<string> fields = new List<string>();
        foreach(PropertyInfo property in properties) {
            object value = property.GetValue(exception, null);
            fields.Add(String.Format(
                             "{0} = {1}",
                             property.Name,
                             value != null ? value.ToString() : String.Empty
            ));    
        }         
        return String.Join("\n", fields.ToArray());
    }