zoukankan      html  css  js  c++  java
  • 构建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 + "
    <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>
    ";
                            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[] { "
    " }, 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>
    " + ex.StackTrace;
                    if (ex.InnerException != null)
                    {
                        str = this.GetStackInfo(ex.InnerException) + "
    " + 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
    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
    Error.cshtml

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

  • 相关阅读:
    C
    B
    A
    poj1222
    请求转发和重定向
    中文乱码
    Servlet 第一天
    Oracle 锁
    Oracle 包的学习
    初学Linux
  • 原文地址:https://www.cnblogs.com/zhangjunwei87/p/4680106.html
Copyright © 2011-2022 走看看