protected virtual void WriteException(IErrorWriter w, ExceptionModel model) { if (model.InnerException != null) { WriteException(w, model.InnerException); } w.Write("<div class='exception'><span class='exceptionType'>"); w.WriteText(model.TypeName); w.Write("</span><span class='exceptionMessage'>"); w.WriteText(model.Message); w.Write("</span><hr />"); if (model.AdditionalInfo != null && model.AdditionalInfo.Length > 0) { w.Write("<div class='exceptionAdditionalInfo'>"); foreach (var info in model.AdditionalInfo) { w.Write("<div> <h3>"); w.WriteText(info.Title); w.Write("</h3>"); if (info.Objects != null) foreach (var obj in info.Objects) { if (info.Display == ExceptionAdditionalInfo.DisplayMode.ToString) { w.Write("<p>" + WebUtility.HtmlEncode(obj.ToString()) + "</p>"); } else if (info.Display == ExceptionAdditionalInfo.DisplayMode.ObjectBrowser) { w.ObjectBrowser(obj); } } w.Write("</div><hr />"); } w.Write("</div>"); } w.ObjectBrowser(model.OriginalException); w.Write("<hr /><div class='exceptionStackTrace'>"); foreach (var frame in model.Stack) { w.Write("<div class='frame'><span class='method code'>"); w.WriteText(FormatMethod(frame.Method)); w.Write(" </span>"); if (frame.At.FileName != null) w.WriteText(frame.At.FileName + " +" + frame.At.LineNumber); w.Write("<span class='docLinks'>"); foreach (var icon in frame.MoreInfo) { w.Write("<a target=\"_blank\" href='" + icon.Link + "'>"); w.Write(icon.ContentHtml); w.Write("</a>"); } w.Write("</span>"); w.WriteSourceCode(frame.At); w.Write("</div>"); } w.Write("</div>"); w.Write("</div>"); }
public ExceptionModel LoadException(Exception exception, StackFrameModel[] existingTrace = null, Func <Exception, StackFrame[]> stackFrameGetter = null, Func <StackFrame, string> methodFormatter = null) { stackFrameGetter = stackFrameGetter ?? (ex => new StackTrace(ex, true).GetFrames()); var m = new ExceptionModel { Message = exception.Message, OriginalException = exception, TypeName = exception.GetType().FullName }; var frames = stackFrameGetter(exception) ?? new StackFrame[0]; var stack = new List <StackFrameModel>(); bool skipping = existingTrace != null; for (int i = frames.Length - 1; i >= 0; i--) { var f = frames[i]; if (skipping && existingTrace.Length > i && f.GetMethod() == existingTrace[i].Method) { continue; } skipping = false; stack.Add(AddMoreInfo(new StackFrameModel { Method = f.GetMethod(), FormattedMethod = methodFormatter?.Invoke(f), At = LoadSourcePiece(f.GetFileName(), f.GetFileLineNumber(), errorColumn: f.GetFileColumnNumber()) })); //Adding additional information to ExceptionModel from InfoLoaders and InfoCollectionLoader m.AdditionalInfo = InfoLoaders.Select(info => info(exception)) .Where(info => info != null && info.Objects != null).ToArray() .Union(InfoCollectionLoader.Select(infoCollection => infoCollection(exception)) .Where(infoCollection => infoCollection != null) .SelectMany(infoCollection => infoCollection) .Where(info => info != null && info.Objects != null).ToArray()) .ToArray(); } stack.Reverse(); m.Stack = stack.ToArray(); if (exception.InnerException != null) { m.InnerException = LoadException(exception.InnerException, m.Stack, stackFrameGetter, methodFormatter); } return(m); }
public ExceptionModel LoadException(Exception exception, StackFrameModel[] existingTrace = null) { var m = new ExceptionModel(); m.Message = exception.Message; m.OriginalException = exception; m.TypeName = exception.GetType().FullName; var frames = new StackTrace(exception, true).GetFrames() ?? new StackFrame[0]; var stack = new List <StackFrameModel>(); bool skipping = existingTrace != null; for (int i = frames.Length - 1; i >= 0; i--) { var f = frames[i]; if (skipping && existingTrace.Length > i && f.GetMethod() == existingTrace[i].Method) { continue; } skipping = false; stack.Add(AddMoreInfo(new StackFrameModel { Method = f.GetMethod(), At = LoadSourcePiece(f.GetFileName(), f.GetFileLineNumber(), errorColumn: f.GetFileColumnNumber()) })); m.AdditionalInfo = InfoLoaders.Select(info => info(exception)).Where(info => info != null && info.Objects != null).ToArray(); } stack.Reverse(); m.Stack = stack.ToArray(); if (exception.InnerException != null) { m.InnerException = LoadException(exception.InnerException, m.Stack); } return(m); }
protected virtual void WriteException(IErrorWriter w, ExceptionModel model) { if (model.InnerException != null) { WriteException(w, model.InnerException); } w.WriteUnencoded("<div class='exception'><span class='exceptionType'>"); w.WriteText(model.TypeName); w.WriteUnencoded("</span><span class='exceptionMessage'>"); w.WriteText(model.Message); w.WriteUnencoded("</span><hr />"); if (model.AdditionalInfo != null && model.AdditionalInfo.Length > 0) { w.WriteUnencoded("<div class='exceptionAdditionalInfo'>"); foreach (var info in model.AdditionalInfo) { w.WriteUnencoded("<div> <h3>"); w.WriteText(info.Title); w.WriteUnencoded("</h3>"); if (info.Objects != null) { foreach (var obj in info.Objects) { if (info.Display == ExceptionAdditionalInfo.DisplayMode.ToString) { w.WriteUnencoded("<p>" + WebUtility.HtmlEncode(obj.ToString()) + "</p>"); } else if (info.Display == ExceptionAdditionalInfo.DisplayMode.ObjectBrowser) { w.ObjectBrowser(obj); } } } w.WriteUnencoded("</div><hr />"); } w.WriteUnencoded("</div>"); } w.ObjectBrowser(model.OriginalException); w.WriteUnencoded("<hr /><div class='exceptionStackTrace'>"); foreach (var frame in model.Stack) { w.WriteUnencoded("<div class='frame'><span class='method code'>"); w.WriteText(FormatMethod(frame.Method)); w.WriteUnencoded(" </span>"); if (frame.At.FileName != null) { w.WriteText(frame.At.FileName + " +" + frame.At.LineNumber); } w.WriteUnencoded("<span class='docLinks'>"); foreach (var icon in frame.MoreInfo) { w.WriteUnencoded("<a target=\"_blank\" href='" + icon.Link + "'>"); w.WriteUnencoded(icon.ContentHtml); w.WriteUnencoded("</a>"); } w.WriteUnencoded("</span>"); w.WriteSourceCode(frame.At); w.WriteUnencoded("</div>"); } w.WriteUnencoded("</div>"); w.WriteUnencoded("</div>"); }
public ExceptionSectionFormatter(ExceptionModel exception, string displayName = "Stack trace", string id = "stack_trace") { this.DisplayName = displayName; this.Exception = exception; this.Id = id; }