构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(13)-系统日志和异常的处理③
上一节我们讲了如何捕获异常和记录日志,这一节我们讲,没有捕获的或者忘记捕获的异常包括404错误等,我们统一处理这个异常。
这一讲是利用 Application_Error 捕获所有异常,全局的异常处理为了减少代码,统一异常处理,Application_Error位于Global.asax里面,
protected void Application_Error(object sender, EventArgs e)
当一个异常在调用堆栈中没有被处理,也没有被框架代码处理时,我们说这个异常未处理,它将被ASP.NET捕获
它将捕获所有 Application 级别的 UnhandleException 和 HttpException(比如:访问的页面不存在等)
总之,在这里处理的话,那么在页面中的所有 try/catch 处理都可以不要了,但是我们为了记录日志,在BLL层还是要try catch
对此未处理错误的处理方法是显示一个页面,列出该未处理异常的详细情况。
我们通过 Application_Error事件把错误写进对应的文件里面或者数据库中。
/// <summary>/// 全局的异常处理/// </summary>/// <param name="sender"></param>/// <param name="e"></param>protected void Application_Error(object sender, EventArgs e){string s = HttpContext.Current.Request.Url.ToString();HttpServerUtility server = HttpContext.Current.Server;if (server.GetLastError() != null){Exception lastError = server.GetLastError();// 此处进行异常记录,可以记录到数据库或文本,也可以使用其他日志记录组件。ExceptionHander.WriteException(lastError);Application["LastError"] = lastError;int statusCode = HttpContext.Current.Response.StatusCode;string exceptionOperator = "/SysException/Error";try{if (!String.IsNullOrEmpty(exceptionOperator)){exceptionOperator = new System.Web.UI.Control().ResolveUrl(exceptionOperator);string url = string.Format("{0}?ErrorUrl={1}", exceptionOperator, server.UrlEncode(s));string script = String.Format("<script language='javascript' type='text/javascript'>window.top.location='{0}';</script>", url);Response.Write(script);Response.End();}}catch { }}}
嘿嘿,我创造了一个错误 Convert.ToInt16("dddd");下面是错误的显示页面
关于错误页面的制作在控制器SysExceptionController增加
public ActionResult Error(){BaseException ex = new BaseException();retu View(ex);}
添加BaseException类

public class BaseException{#region 变量private string exceptionMessage;private string exceptionName;private string innerExceptionMessage;private string innerExceptionName;private bool isShow;private Exception outermostException;private string sourceErrorFile;private string sourceErrorRowID;private string stackInfo;private string targetSite;#endregion#region 属性public string ErrorPageUrl{get{retu this.GetExceptionUrl();}}public Exception Exception{get{retu (HttpContext.Current.Session["Exception"] as Exception);}private set{HttpContext.Current.Session["Exception"] = value;}}public string ExceptionMessage{get{retu this.exceptionMessage;}private set{this.exceptionMessage = value;}}public string ExceptionName{get{retu this.exceptionName;}private set{this.exceptionName = value;}}public string InnerExceptionMessage{get{retu this.innerExceptionMessage;}private set{this.innerExceptionMessage = value;}}public string InnerExceptionName{get{retu this.innerExceptionName;}private set{this.innerExceptionName = value;}}public bool IsShowStackInfo{get{retu this.isShow;}private set{this.isShow = value;}}public string SourceErrorFile{get{retu this.sourceErrorFile;}private set{this.sourceErrorFile = value;}}public string SourceErrorRowID{get{retu this.sourceErrorRowID;}private set{this.sourceErrorRowID = value;}}public string StackInfo{get{retu this.stackInfo;}private set{this.stackInfo = value;}}public string TargetSite{get{retu this.targetSite;}private set{this.targetSite = value;}}#endregionpublic BaseException(){this.outermostException = null;this.exceptionName = null;this.exceptionMessage = null;this.innerExceptionName = null;this.innerExceptionMessage = null;this.targetSite = null;this.stackInfo = null;this.sourceErrorFile = null;this.sourceErrorRowID = null;this.isShow = false;try{this.Exception = HttpContext.Current.Application["LastError"] as Exception;if (this.Exception != null){this.outermostException = this.Exception;if ((this.Exception is HttpUnhandledException) && (this.Exception.InnerException != null)){this.Exception = this.Exception.InnerException;}this.ExceptionName = this.GetExceptionName(this.Exception);this.ExceptionMessage = this.GetExceptionMessage(this.Exception);if (this.Exception.InnerException != null){this.InnerExceptionName = this.GetExceptionName(this.Exception.InnerException);this.InnerExceptionMessage = this.GetExceptionMessage(this.Exception.InnerException);}this.TargetSite = this.GetTargetSite(this.Exception);this.StackInfo = this.GetStackInfo(this.Exception);if ((this.outermostException is HttpUnhandledException) && (this.outermostException.InnerException != null)){this.StackInfo = this.StackInfo + "\r\n<a href='#' onclick=\"if(document.getElementById('phidden').style.display=='none') document.getElementById('phidden').style.display='block'; else document.getElementById('phidden').style.display='none'; retu false;\"><b>[" + this.outermostException.GetType().ToString() + "]</b></a>\r\n";this.StackInfo = this.StackInfo + "<pre id='phidden' style='display:none;'>" + this.outermostException.StackTrace + "</pre>";}this.SourceErrorFile = this.GetSourceErrorFile();this.SourceErrorRowID = this.GetSourceErrorRowID();this.IsShowStackInfo = true;}HttpContext.Current.Session["LastError"] = null;}catch (Exception exception){this.ExceptionMessage = "异常基页出错" + exception.Message;}}#region 方法private string GetExceptionMessage(Exception ex){retu ex.Message;}private string GetExceptionMessageForLog(){StringBuilder builder = new StringBuilder(50);builder.AppendFormat("<ExceptionName>{0}</ExceptionName>", this.ExceptionName);builder.AppendFormat("<ExceptionMessage>{0}</ExceptionMessage>", this.ExceptionMessage);builder.AppendFormat("<InnerExceptionName>{0}</InnerExceptionName>", this.InnerExceptionName);builder.AppendFormat("<InnerExceptionMessage>{0}</InnerExceptionMessage>", this.InnerExceptionMessage);builder.AppendFormat("<TargetSite>{0}</TargetSite>", this.TargetSite);builder.AppendFormat("<ErrorPageUrl>{0}</ErrorPageUrl>", this.ErrorPageUrl);builder.AppendFormat("<SourceErrorFile>{0}</SourceErrorFile>", this.SourceErrorFile);builder.AppendFormat("<SourceErrorRowID>{0}</SourceErrorRowID>", this.SourceErrorRowID);retu builder.ToString();}private string GetExceptionMessageForMail(){StringBuilder builder = new StringBuilder(50);builder.Append("<ExceptionInfo>");builder.Append(this.GetExceptionMessageForLog());builder.AppendFormat("<StackInfo><![CDATA[{0}]]></StackInfo>", this.StackInfo);builder.Append("</ExceptionInfo>");retu builder.ToString();}private string GetExceptionName(Exception ex){string str = null;if (ex != null){str = ex.GetType().FullName;}retu str;}private string GetExceptionUrl(){string str = null;if (HttpContext.Current.Request["ErrorUrl"] != null){str = HttpContext.Current.Request["ErrorUrl"].ToString();}retu str;}private string GetSourceErrorFile(){string stackInfo = this.StackInfo;string[] strArray = new string[0];if (stackInfo == null){retu stackInfo;}strArray = stackInfo.Split(new string[] { "位置", "行号" }, StringSplitOptions.RemoveEmptyEntries);if (strArray.Length >= 3){stackInfo = strArray[1];if (stackInfo.LastIndexOf(":") == (stackInfo.Length - 1)){stackInfo = stackInfo.Substring(0, stackInfo.Length - 1);}retu stackInfo;}retu "";}private string GetSourceErrorRowID(){string stackInfo = this.StackInfo;string[] strArray = new string[0];if (stackInfo == null){retu stackInfo;}strArray = stackInfo.Split(new string[] { "行号" }, StringSplitOptions.RemoveEmptyEntries);if (strArray.Length >= 2){stackInfo = strArray[1].Trim();string[] strArray2 = stackInfo.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);if (strArray2.Length >= 2){stackInfo = strArray2[0];}retu stackInfo;}retu "";}private string GetStackInfo(Exception ex){string str = null;if (ex != null){str = "<b>[" + ex.GetType().ToString() + "]</b>\r\n" + ex.StackTrace;if (ex.InnerException != null){str = this.GetStackInfo(ex.InnerException) + "\r\n" + str;}}retu str;}private string GetTargetSite(Exception ex){string str = null;if (ex != null){ex = this.GetBenmostException(ex);MethodBase targetSite = ex.TargetSite;if (targetSite != null){str = string.Format("{0}.{1}", targetSite.DeclaringType, targetSite.Name);}}retu str;}protected Exception GetBenmostException(Exception ex){while (true){if (ex.InnerException != null){ex = ex.InnerException;}else{retu ex;}}}#endregion}
添加Error视图

@model App.Admin.Controllers.BaseException@{ViewBag.Title = "异常处理页面";Layout = "~/Views/Shared/_Index_Layout.cshtml";}<h2>系统错误</h2><div style="text-align:center;"><table width="100%" class="blueTab" border="0" cellspacing="1" cellpadding="1"><tr><td colspan="3"><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td > 错误处理页面</td></tr></tbody></table></td></tr><tr id="youhaotishi" ><td colspan="2" align="left"> 欢迎您光临本网站!网站运行发生错误,请与管理员联系。错误原因可能如下:<br /> 1.非法访问页面.<br /> 2.您输入的数据错误.<br /> 3.您访问的页面不存在.<br /> 4.内容不存在,或已被删除.<br /> 5.系统忙,请稍候再试.</td></tr><tbody id="detailInformation" style="display: none;"><tr><td width="20%" class="alignRight" nowrap><strong>出错页面:</strong></td><td class="alignLeft">@Html.DisplayFor(model => model.ErrorPageUrl) </td></tr><tr><td class="alignRight" nowrap><strong>异常名称:</strong></td><td class="alignLeft">@Html.DisplayFor(model => model.ExceptionName) </td></tr><tr><td class="alignRight" nowrap><strong>异常信息:</strong></td><td class="alignLeft">@Html.DisplayFor(model => model.ExceptionMessage) </td></tr><tr id="trInnerExceptionName" runat="server"><td class="alignRight" nowrap><strong>内部异常名称:</strong></td><td class="alignLeft">@Html.DisplayFor(model => model.InnerExceptionName) </td></tr><tr id="trInnerExceptionMessage" runat="server"><td class="alignRight" nowrap><strong>内部异常信息:</strong></td><td class="alignLeft">@Html.DisplayFor(model => model.InnerExceptionMessage) </td></tr><tr id="trExceptionMethod" runat="server"><td class="alignRight" nowrap><strong>方法名称:</strong></td><td class="alignLeft" style="background-color: #ffffcc;"> @Html.DisplayFor(model => model.TargetSite) </td></tr><tr id="trExceptionSource" runat="server"><td class="alignRight" nowrap><strong>源文件:</strong></td><td class="alignLeft" style="background-color: #ffffcc;">@Html.DisplayFor(model => model.SourceErrorFile) </td></tr><tr id="trExceptionRowId" runat="server"><td class="alignRight" nowrap><strong>行号:</strong></td><td class="alignLeft" style="background-color: #ffffcc; color: Red"> @Html.DisplayFor(model => model.SourceErrorRowID) </td></tr><tr runat="server" id="trStack" visible="false"><td class="alignRight"><strong>堆栈跟踪:</strong></td><td class="alignLeft" style="background-color: #ffffcc;"><code><pre id="litStack"><textarea name="errormsg" cols="80" rows="30" readonly="readonly">@Html.DisplayFor(model => model.StackInfo) </textarea> </pre></code></td></tr></tbody></table><a id="showMessage" href="#" onclick="ShowErrorMessage();retu false;">显示详细信息</a></div><script type="text/javascript">var isShowMessage = true;function ShowErrorMessage() {var obj = document.getElementById("showMessage")var detailInformation = document.getElementById("detailInformation");var youhaotishi = document.getElementById("youhaotishi");if (isShowMessage) {obj.innerText = "隐藏详细信息";isShowMessage = false;detailInformation.style.display = "block";youhaotishi.style.display = "none";}else {obj.innerText = "显示详细信息";isShowMessage = true;detailInformation.style.display = "none";youhaotishi.style.display = "block";}}</script>
由于系统是后台系统,我并没有做得很漂亮的错误页面(实际很丑),大家发货你的想象力和美工能力,造一个好看的,记得共享给我,有奖
出处: http://ymnets.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
作者:ymnets
来源链接:https://www.cnblogs.com/ymnets/p/3438319.html
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。