PageRenderTime 46ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/src/MarkPad/Infrastructure/ExceptionBuilder.cs

https://github.com/bcott/DownmarkerWPF
C# | 191 lines | 157 code | 34 blank | 0 comment | 12 complexity | 2cc047de5306f607c5ed2831e889ccb6 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Reflection;
  6. using System.Text;
  7. namespace MarkPad.Infrastructure
  8. {
  9. public class ExceptionBuilder
  10. {
  11. private static string ExceptionPartToString(string header, Exception exception, Func<Exception, string> map)
  12. {
  13. string part;
  14. try
  15. {
  16. part = map(exception);
  17. }
  18. catch (Exception e)
  19. {
  20. part = e.Message;
  21. }
  22. return header + part;
  23. }
  24. private static string FunctionToString(string header, Func<string> func)
  25. {
  26. string part;
  27. try
  28. {
  29. part = func();
  30. }
  31. catch (Exception e)
  32. {
  33. part = e.Message;
  34. }
  35. return header + part;
  36. }
  37. public static string ExceptionToString(Exception exception)
  38. {
  39. return ExceptionToString(exception, true);
  40. }
  41. private static string ExceptionToString(Exception exception, bool includeSysInfo)
  42. {
  43. var exceptionString = new StringBuilder();
  44. if (exception.InnerException != null)
  45. {
  46. exceptionString.AppendLine("(Inner Exception)");
  47. exceptionString.AppendLine(ExceptionToString(exception.InnerException, false));
  48. exceptionString.AppendLine("(Outer Exception)");
  49. }
  50. if (includeSysInfo)
  51. exceptionString.Append(SysInfoToString());
  52. exceptionString.AppendLine(ExceptionPartToString("Exception Source: ", exception, e => e.Source));
  53. exceptionString.AppendLine(ExceptionPartToString("Exception Type: ", exception, e => e.GetType().FullName));
  54. exceptionString.AppendLine(ExceptionPartToString("Exception Message: ", exception, e => e.Message));
  55. exceptionString.AppendLine(ExceptionPartToString("Exception Target Site: ", exception, e => e.TargetSite.Name));
  56. exceptionString.AppendLine(ExceptionPartToString("", exception, EnhancedStackTrace));
  57. return exceptionString.ToString();
  58. }
  59. private static string EnhancedStackTrace(Exception exception)
  60. {
  61. return EnhancedStackTrace(new StackTrace(exception, true));
  62. }
  63. private static string EnhancedStackTrace(StackTrace stackTrace)
  64. {
  65. var sb = new StringBuilder();
  66. sb.AppendLine();
  67. sb.Append("---- Stack Trace ----");
  68. sb.AppendLine();
  69. for (int frame = 0; frame < stackTrace.FrameCount; frame++)
  70. {
  71. StackFrame sf = stackTrace.GetFrame(frame);
  72. sb.Append(StackFrameToString(sf));
  73. }
  74. sb.AppendLine();
  75. return sb.ToString();
  76. }
  77. private static string StackFrameToString(StackFrame sf)
  78. {
  79. var sb = new StringBuilder();
  80. MemberInfo mi = sf.GetMethod();
  81. sb.AppendFormat(" {0}.{1}.{2}",
  82. mi.DeclaringType.Namespace,
  83. mi.DeclaringType.Name,
  84. mi.Name);
  85. ParameterInfo[] parameters = sf.GetMethod().GetParameters();
  86. sb.Append("(");
  87. sb.Append(String.Join(", ", parameters.Select(p => String.Format("{0} {1}", p.ParameterType.Name, p.Name)).ToArray()));
  88. sb.Append(")");
  89. sb.AppendLine();
  90. sb.Append(" ");
  91. if (String.IsNullOrEmpty(sf.GetFileName()))
  92. {
  93. sb.Append(Path.GetFileName(ParentAssembly.CodeBase));
  94. sb.Append(": N ");
  95. sb.AppendFormat("{0:#00000}", sf.GetNativeOffset());
  96. }
  97. else
  98. {
  99. sb.Append(Path.GetFileName(sf.GetFileName()));
  100. sb.AppendFormat(": line {0:#0000}, col {1:#00}", sf.GetFileLineNumber(), sf.GetFileColumnNumber());
  101. if (sf.GetILOffset() != StackFrame.OFFSET_UNKNOWN)
  102. {
  103. sb.AppendFormat(", IL {0:#0000}", sf.GetILOffset());
  104. }
  105. }
  106. sb.AppendLine();
  107. return sb.ToString();
  108. }
  109. private static string SysInfoToString()
  110. {
  111. var sysinfo = new StringBuilder();
  112. sysinfo.AppendFormat("Date and Time: {0}{1}", DateTime.Now, Environment.NewLine);
  113. sysinfo.AppendLine(FunctionToString("OS Version: ", () => Environment.OSVersion.VersionString));
  114. sysinfo.AppendLine();
  115. sysinfo.AppendLine(FunctionToString("Application Domain: ", () => AppDomain.CurrentDomain.FriendlyName));
  116. sysinfo.AppendLine(FunctionToString("Assembly Codebase: ", () => ParentAssembly.CodeBase));
  117. sysinfo.AppendLine(FunctionToString("Assembly Full Name: ", () => ParentAssembly.FullName));
  118. sysinfo.AppendLine(FunctionToString("Assembly Version: ", () => ParentAssembly.GetName().Version.ToString()));
  119. sysinfo.AppendLine(FunctionToString("Assembly Build Date: ", () => AssemblyBuildDate(ParentAssembly).ToString()));
  120. sysinfo.AppendLine();
  121. return sysinfo.ToString();
  122. }
  123. private static DateTime AssemblyBuildDate(Assembly parentAssembly)
  124. {
  125. try
  126. {
  127. Version v = parentAssembly.GetName().Version;
  128. DateTime buildDate = new DateTime(2000, 1, 1).AddDays(v.Build).AddSeconds(v.Revision * 2);
  129. if (TimeZone.IsDaylightSavingTime(DateTime.Now, TimeZone.CurrentTimeZone.GetDaylightChanges(DateTime.Now.Year)))
  130. buildDate = buildDate.AddHours(1);
  131. if (buildDate > DateTime.Now || v.Build < 730 || v.Revision == 0)
  132. buildDate = AssemblyFileTime(parentAssembly);
  133. return buildDate;
  134. }
  135. catch
  136. {
  137. return DateTime.MinValue;
  138. }
  139. }
  140. private static DateTime AssemblyFileTime(Assembly parentAssembly)
  141. {
  142. try
  143. {
  144. return File.GetLastWriteTime(parentAssembly.Location);
  145. }
  146. catch (Exception)
  147. {
  148. return DateTime.MaxValue;
  149. }
  150. }
  151. private static Assembly parentAssembly;
  152. private static Assembly ParentAssembly
  153. {
  154. get { return parentAssembly ?? (parentAssembly = Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly()); }
  155. }
  156. }
  157. }