构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(13)-系统日志和异常的处理③

简介: 原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(13)-系统日志和异常的处理③ 上一节我们讲了如何捕获异常和记录日志,这一节我们讲,没有捕获的或者忘记捕获的异常包括404错误等,我们统一处理这个异常。

原文:构建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();
            return 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
            {
                return this.GetExceptionUrl();
            }
        }
        public Exception Exception
        {
            get
            {
                return (HttpContext.Current.Session["Exception"] as Exception);
            }
            private set
            {
                HttpContext.Current.Session["Exception"] = value;
            }
        }
        public string ExceptionMessage
        {
            get
            {
                return this.exceptionMessage;
            }
            private set
            {
                this.exceptionMessage = value;
            }
        }
        public string ExceptionName
        {
            get
            {
                return this.exceptionName;
            }
            private set
            {
                this.exceptionName = value;
            }
        }
        public string InnerExceptionMessage
        {
            get
            {
                return this.innerExceptionMessage;
            }
            private set
            {
                this.innerExceptionMessage = value;
            }
        }
        public string InnerExceptionName
        {
            get
            {
                return this.innerExceptionName;
            }
            private set
            {
                this.innerExceptionName = value;
            }
        }
        public bool IsShowStackInfo
        {
            get
            {
                return this.isShow;
            }
            private set
            {
                this.isShow = value;
            }
        }
        public string SourceErrorFile
        {
            get
            {
                return this.sourceErrorFile;
            }
            private set
            {
                this.sourceErrorFile = value;
            }
        }
        public string SourceErrorRowID
        {
            get
            {
                return this.sourceErrorRowID;
            }
            private set
            {
                this.sourceErrorRowID = value;
            }
        }
        public string StackInfo
        {
            get
            {
                return this.stackInfo;
            }
            private set
            {
                this.stackInfo = value;
            }
        }
        public string TargetSite
        {
            get
            {
                return this.targetSite;
            }
            private set
            {
                this.targetSite = value;
            }
        }
        #endregion


        public 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'; return 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)
        {
            return 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);
            return 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>");
            return builder.ToString();
        }

        private string GetExceptionName(Exception ex)
        {
            string str = null;
            if (ex != null)
            {
                str = ex.GetType().FullName;
            }

            return str;
        }

        private string GetExceptionUrl()
        {
            string str = null;
            if (HttpContext.Current.Request["ErrorUrl"] != null)
            {
                str = HttpContext.Current.Request["ErrorUrl"].ToString();
            }
            return str;
        }

        private string GetSourceErrorFile()
        {
            string stackInfo = this.StackInfo;
            string[] strArray = new string[0];
            if (stackInfo == null)
            {
                return 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);
                }
                return stackInfo;
            }
            return "";
        }
        private string GetSourceErrorRowID()
        {
            string stackInfo = this.StackInfo;
            string[] strArray = new string[0];
            if (stackInfo == null)
            {
                return 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];
                }
                return stackInfo;
            }
            return "";
        }
        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;
                }
            }
            return 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);
                }
            }
            return str;
        }
        protected Exception GetBenmostException(Exception ex)
        {
            while (true)
            {
                if (ex.InnerException != null)
                {
                    ex = ex.InnerException;
                }
                else
                {
                    return ex;
                }
            }
        }
        #endregion
    }
BaseException

添加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 >
                                    &nbsp;错误处理页面</td>
                            </tr>
                        </tbody>
                    </table>
                </td>
            </tr>
            <tr id="youhaotishi" >
                <td colspan="2" align="left">
                    &nbsp;欢迎您光临本网站!网站运行发生错误,请与管理员联系。错误原因可能如下:
                    <br />
                    &nbsp;&nbsp;&nbsp;1.非法访问页面.
                    <br />
                    &nbsp;&nbsp;&nbsp;2.您输入的数据错误.
                    <br />
                    &nbsp;&nbsp;&nbsp;3.您访问的页面不存在.
                    <br />
                    &nbsp;&nbsp;&nbsp;4.内容不存在,或已被删除.
                    <br />
                    &nbsp;&nbsp;&nbsp;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;">
                        &nbsp;@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">
                        &nbsp;@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();return 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>
Error.cshtml

 由于系统是后台系统,我并没有做得很漂亮的错误页面(实际很丑),大家发货你的想象力和美工能力,造一个好看的,记得共享给我,有奖

目录
相关文章
|
7天前
|
前端开发 C# 开发者
.NET使用Umbraco CMS快速构建一个属于自己的内容管理系统
.NET使用Umbraco CMS快速构建一个属于自己的内容管理系统
25 12
|
7天前
|
Web App开发 前端开发 调度
一款基于 .NET + Blazor 开发的智能访客管理系统
一款基于 .NET + Blazor 开发的智能访客管理系统
|
7天前
|
开发框架 JavaScript 前端开发
精选2款.NET开源的博客系统
精选2款.NET开源的博客系统
|
7天前
|
前端开发 JavaScript C#
基于.NET8+Vue3开发的权限管理&个人博客系统
基于.NET8+Vue3开发的权限管理&个人博客系统
|
2月前
|
开发框架 安全 Java
.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力
本文深入探讨了.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力。.NET不仅支持跨平台开发,具备出色的安全性和稳定性,还能与多种技术无缝集成,为企业级应用提供全面支持。
37 3
|
3月前
|
关系型数据库 C# 数据库
.NET 8.0 开源在线考试系统(支持移动端)
【10月更文挑战第27天】以下是适用于 .NET 8.0 的开源在线考试系统(支持移动端)的简介: 1. **基于 .NET Core**:跨平台,支持多种数据库,前后端分离,适用于多操作系统。 2. **结合 Blazor**:使用 C# 开发 Web 应用,支持响应式设计,优化移动端体验。 3. **基于 .NET MAUI**:跨平台移动应用开发,一套代码多平台运行,提高开发效率。 开发时需关注界面设计、安全性与稳定性。
|
3月前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
|
2月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
442 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
24天前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
|
3月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
360 3