public ErrorReporting(Exception uncaughtException)
: this(InvariantMessage(uncaughtException), InvariantStackTrace(uncaughtException))
{
try
{
if (ReferenceEquals(uncaughtException.GetType(), typeof(System.Data.SQLite.SQLiteException)))
{
// Add extra information to the exception to help debug sqlite concurrency
uncaughtException = SQLiteMonDataReader.AddReadersInfo(uncaughtException);
uncaughtException = SQLiteMonTransaction.AddTransactionsInfo(uncaughtException);
}
this.fields.Add("Exception.ToString()", uncaughtException.ToString());
// Set up a list of types which do not need to be serialized
List <Type> notSerialize = new List <Type>(new Type[]
{
typeof(string),
typeof(int),
typeof(float),
typeof(double),
typeof(bool)
});
// Store the type of the exception and get a list of its properties to loop through
Type exceptionType = uncaughtException.GetType();
PropertyInfo[] baseExceptionProperties = typeof(Exception).GetProperties();
bool extraProperty = false;
bool overloadedProp = false;
foreach (PropertyInfo thisExpProperty in exceptionType.GetProperties())
{
extraProperty = true;
overloadedProp = false;
// Check if this property exists in the base exception class: if not then add it to the report
foreach (PropertyInfo baseProperty in baseExceptionProperties)
{
if (thisExpProperty.Name == baseProperty.Name)
{
extraProperty = false;
break;
}
}
// Test to see if this property is overloaded
foreach (PropertyInfo overloadChkProp in exceptionType.GetProperties())
{
if (!overloadChkProp.Equals(thisExpProperty))
{
if (overloadChkProp.Name == thisExpProperty.Name)
{
overloadedProp = true;
break;
}
}
}
if (extraProperty)
{
string fieldName = "Exception." + thisExpProperty.Name;
object propertyValue = thisExpProperty.GetValue(uncaughtException, null);
if (overloadedProp)
{
string typeName = propertyValue.GetType().ToString();
int dotPos = typeName.LastIndexOf(".", StringComparison.Ordinal);
if (dotPos >= 0)
{
typeName = typeName.Substring(dotPos + 1);
}
fieldName += ":" + typeName;
}
if (propertyValue != null && !string.IsNullOrEmpty(propertyValue.ToString()))
{
if (propertyValue.GetType() == typeof(Provider.ErrorType))
{
// ErrorType is always set to UnknownError on DownloadExceptions
continue;
}
if (!notSerialize.Contains(propertyValue.GetType()))
{
if (propertyValue.GetType().IsSerializable)
{
// Attempt to serialize the object as an XML string
try
{
StringWriter valueStringWriter = new StringWriter(CultureInfo.InvariantCulture);
XmlSerializer valueSerializer = new XmlSerializer(propertyValue.GetType());
valueSerializer.Serialize(valueStringWriter, propertyValue);
this.fields.Add(fieldName, valueStringWriter.ToString());
continue;
}
catch (NotSupportedException)
{
// Not possible to serialize - do nothing & fall through to the ToString code
}
catch (InvalidOperationException)
{
// Problem serializing the object - do nothing & fall through to the ToString code
}
}
}
this.fields.Add(fieldName, propertyValue.ToString());
}
}
}
if (uncaughtException.Data != null)
{
foreach (DictionaryEntry dataEntry in uncaughtException.Data)
{
if (ReferenceEquals(dataEntry.Key.GetType(), typeof(string)) && ReferenceEquals(dataEntry.Value.GetType(), typeof(string)))
{
this.fields[(string)dataEntry.Key] = (string)dataEntry.Value;
}
}
}
}
catch
{
// No way of reporting errors that have happened here, so try to continue
}
}