"Sometimes, web applications error out," Brian writes via the Submit to The Daily WTF plug-in. "In ASP.NET, a simple web.config entry will redirect all errors to a given location like, errors.aspx. On that page, you can call Server.GetLastError() to get all the error deatils you'd like, including a full stack trace. For more advanced scenarios, you can use the Application_Error event to log errors. "
"Or, you could do what my predecessor did and rewrite the built-in behavior with something woefully inadequate. In this case, he decided to build some kind of XML object to wrap a System.Exception, then forward that error in a URL encoded with Base 64."
protected void Application_Error(object sender, EventArgs e) { ASCIIEncoding encoding = new ASCIIEncoding(); StringWriter exceptionString = new StringWriter(); Exception ex = Server.GetLastError(); if (ex.InnerException != null) ex = ex.InnerException; string url = HttpContext.Current.Request.Url.AbsoluteUri; log.Error("File Request: " + url, ex); string queryString = string.Empty; //This is a code snippet for serializing Exceptions using LINQ XElement root = new XElement("Exception"); if (ex.Message != null) { root.Add(new XElement("Message", ex.Message)); } if (ex.StackTrace != null) { root.Add ( new XElement("StackTrace", from frame in ex.StackTrace.Split('\n') let prettierFrame = frame.Substring(6).Trim() select new XElement("Frame", prettierFrame)) ); } if (ex.Data.Count > 0) { root.Add ( new XElement("Data", from entry in ex.Data.Cast() let key = entry.Key.ToString() let value = (entry.Value == null) ? "null" : entry.Value.ToString() select new XElement(key, value)) ); } queryString = Convert.ToBase64String(encoding.GetBytes(root.ToString())); Response.Redirect("/admin/Error.aspx?ex=" + Server.UrlEncode(queryString)); }
Of course, if anything goes wrong encoding your error, it will generate a new error, which attempts to do the same thing, usually in a circle of recursive fail.