namespace Zerotrilogy.ApplicationBlocks.Framework { using System; using System.Collections.Specialized; using System.Reflection; using System.Text; /// /// Summary description for ExceptionConfig. /// public class ExceptionConfig { private const string TEXT_SEPARATOR = "*********************************************"; // no instance creations private ExceptionConfig() {} public static string FormatException(Exception exception) { // Create StringBuilder to maintain publishing information. StringBuilder strInfo = new StringBuilder(); if (exception == null) { strInfo.AppendFormat("{0}{0}No Exception object has been provided.{0}", Environment.NewLine); } else { #region Loop through each exception class in the chain of exception objects // Loop through each exception class in the chain of exception objects. Exception currentException = exception; // Temp variable to hold InnerException object during the loop. int intExceptionCount = 1; // Count variable to track the number of exceptions in the chain. do { // Write title information for the exception object. strInfo.AppendFormat("{0}{0}{1}) Exception Information{0}{2}", Environment.NewLine, intExceptionCount.ToString(), TEXT_SEPARATOR); strInfo.AppendFormat("{0}Exception Type: {1}", Environment.NewLine, currentException.GetType().FullName); #region Loop through the public properties of the exception object and record their value // Loop through the public properties of the exception object and record their value. PropertyInfo[] aryPublicProperties = currentException.GetType().GetProperties(); NameValueCollection currentAdditionalInfo; foreach (PropertyInfo p in aryPublicProperties) { // Do not log information for the InnerException or StackTrace. This information is // captured later in the process. if (p.Name != "InnerException" && p.Name != "StackTrace") { if (p.GetValue(currentException,null) == null) { strInfo.AppendFormat("{0}{1}: NULL", Environment.NewLine, p.Name); } else { // Loop through the collection of AdditionalInformation if the exception type is a BaseApplicationException. if (p.Name == "AdditionalInformation") // && currentException is BaseApplicationException) { // Verify the collection is not null. if (p.GetValue(currentException,null) != null) { // Cast the collection into a local variable. currentAdditionalInfo = (NameValueCollection)p.GetValue(currentException,null); // Check if the collection contains values. if (currentAdditionalInfo.Count > 0) { strInfo.AppendFormat("{0}AdditionalInformation:", Environment.NewLine); // Loop through the collection adding the information to the string builder. for (int i = 0; i < currentAdditionalInfo.Count; i++) { strInfo.AppendFormat("{0}{1}: {2}", Environment.NewLine, currentAdditionalInfo.GetKey(i), currentAdditionalInfo[i]); } } } } // Otherwise just write the ToString() value of the property. else { strInfo.AppendFormat("{0}{1}: {2}", Environment.NewLine, p.Name, p.GetValue(currentException,null)); } } } } #endregion #region Record the Exception StackTrace // Record the StackTrace with separate label. if (currentException.StackTrace != null) { strInfo.AppendFormat("{0}{0}StackTrace Information{0}{1}", Environment.NewLine, TEXT_SEPARATOR); strInfo.AppendFormat("{0}{1}{0}", Environment.NewLine, currentException.StackTrace); } #endregion // Reset the temp exception object and iterate the counter. currentException = currentException.InnerException; intExceptionCount++; } while (currentException != null); #endregion } return strInfo.ToString(); } } }