zoukankan      html  css  js  c++  java
  • MVC 自定义异常错误页面处理

    1.配置文件:webConfig中配置经常出现的错误页面:

     <system.web>节点下添加 <customErrors>节点,在 <customErrors>节点下配置<error>错误信息,如下:

     <system.web>
        <customErrors mode="On" defaultRedirect="~/Html_Tools/Html_UI/Error_404.htm">
          <error statusCode="404" redirect="~/Html_Tools/Html_UI/Error_404.htm" />
          <error statusCode="500" redirect="~/Html_Tools/Html_UI/Error_500.htm" />
        </customErrors>
        <!--发布时改为false,开发时为true-->
        <compilation debug="true" targetFramework="4.6" />
        <!--配置文件传输大小限制-->
        <httpRuntime maxRequestLength="51200"  targetFramework="4.6" />
      </system.web>

    2.自定义异常处理错误页面:

    ASP.Net MVC3中如果配置文件出错了,怎么跳转到自定义的错误页,现在参考网上的档案是说

    添加 如下配置文件,并且在路径Views/Shared/下添加Error页面,测试下没有用的,请大家看看有什么好的建议啊,谢谢了啊!

    <system.web>

      <customErrors mode="On" defaultRedirect="/Base/Error/">
       </customErrors>

    </system.web>


    MVC根本不会理睬web.config中的customErrors,默认是由HandleErrorAttribute处理的,显示的是/Views/Shared/Error.cshtml中内容。

     

    mvc中,可以用过滤器来实现异常处理

    1.在Global.asax文件,

           //1.在Global.asax文件中
            public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
                filters.Add(new ExceptionFilterAttribute());  //自己定义的过滤器
            }
          /// <summary>
          /// 2.自己定义的过滤器 处理异常跳转错误页
          /// 捕获异常 跳转到错误页
          /// </summary>
        public class ExceptionFilterAttribute : HandleErrorAttribute {
            public override void OnException(ExceptionContext filterContext) {
                base.OnException(filterContext);
                string excepitonInfo = filterContext.Exception.ToString();
                //LogHelper.OutputLog(excepitonInfo);//记录日志
                filterContext.HttpContext.Response.Redirect("~/Html_Tools/Html_UI/Error.htm");
            }
        }

    当ASP.NET MVC程序出现了异常,怎么处理更加规范?

    1. 最简单的方法是设置<customErrors/>节点

    <customErrors>节点用 于定义一些自定义错误信息的信息。此节点有Mode和defaultRedirect两个属性,其中defaultRedirect属性是一个可选属性, 表示应用程序发生错误时重定向到的默认URL,如果没有指定该属性则显示一般性错误。Mode属性是一个必选属性,它有三个可能值,它们所代表的意义分别 如下:
    On 表示在本地和远程用户都会看到自定义错误信息。
    Off 禁用自定义错误信息,本地和远程用户都会看到详细的错误信息。
    RemoteOnly 表示本地用户将看到详细错误信息,而远程用户将会看到自定义错误信息。

    这里有必要说明一下本地用户和远程用户的概念。当 我们访问asp.net应用程时所使用的机器和发布asp.net应用程序所使用的机器为同一台机器时成为本地用户,反之则称之为远程用户。在开发调试阶 段为了便于查找错误Mode属性建议设置为Off,而在部署阶段应将Mode属性设置为On或者RemoteOnly,以避免这些详细的错误信息暴露了程 序代码细节从而引来黑客的入侵。

    <error>子节点

    在<customErrors>节点 下还包含有<error>子节点,这个节点主要是根据服务器的HTTP错误状态代码而重定向到我们自定义的错误页面,注意要 使<error>子节点下的配置生效,必须将<customErrors>节点节点的Mode属性设置为“On”。下面是一个例 子:

     

        <customErrors mode="On" defaultRedirect="~/Html_Tools/Html_UI/Error_404.htm">
          <error statusCode="404" redirect="~/Html_Tools/Html_UI/Error_404.htm" />
          <error statusCode="500" redirect="~/Html_Tools/Html_UI/Error_500.htm" />
        </customErrors>

     

    在上面的配置中如果用户访问的页面不存在就会跳转到404.htm页面,如果服务端的内部错误的页面则会跳转到500.htm页面,500.htm和404.htm页面都是我们自己添加的页面,我们可以在页面中给出友好的错误提示。

     

    2. 使用过滤器HandleErrorAttribute

    随着ASP.NET MVC版本的更新,出现了HandleErrorAttribute,使用Filter以AOP的思想实现了针对于Action的异常处理。使用此 Filter后,当程序中出现异常的时候,会去封装这些异常信息,然后路由自动转到该Controller对应的Error.cshtml中,如果此路径 下没有改文件,则会到shared目录中寻找此文件。另外一个相关的是在Global.asax中的protected void Application_Error(object sender, EventArgs e)方法,是捕捉异常的最后一道防线,也就是说,这是最高层次的异常捕获处理逻辑。 使用HandleErrorAttribute后,找到了Error.cshtml,则此时异常已经被捕获处理,所以不会再次被 Application_Error捕获处理。此外,可以通过@model HandleErrorInfo 在Error.cshtml中定制显示异常信息。有一点需要注意的是,HandleErrorAttribute是在customErrors基础之上的,如果想使用HandleErrorAttribute,customErrors的Mode必须要设置为On或RemoteOnly. 否则,HandleErrorAttribute将不起作用。

    3. 自定义显示路径

    如果遇到异常后不单单是要自定义异常显示,而且还 需要进行日志记录。此时,可以通过继承扩展HandleErrorAttribute来实现新的Filter,然后在lobal.ascx中对所有的 Action进行注册,filters.Add(new MyHandleErrorAttribute()).在这里详细说明一下另一种方式。我们可以写一个专门的Controller和Action来进行异 常发生时的路由设置.

     

        public class UtilityController : Controller  
            {  
                public ActionResult Error()  
                {  
                    return View();  
                }  
          
                public ActionResult PageNotFound()  
                {  
                    return View();  
                }  
        }  

     

    当出现异常的时候,把异常抛到最顶端,由Application_Error统一处理。这里的统一处理就包括,记录日志,重新进行页面定向等。

        protected void Application_Error(object sender, EventArgs e)  
                {  
                    var ex = Server.GetLastError();  
                    Log.Error(ex); //记录日志信息  
                    var httpStatusCode = (ex is HttpException) ? (ex as HttpException).GetHttpCode() : 500; //这里仅仅区分两种错误  
                    var httpContext = ((MvcApplication)sender).Context;  
                    httpContext.ClearError();  
                    httpContext.Response.Clear();  
                    httpContext.Response.StatusCode = httpStatusCode;  
                    var shouldHandleException = true;  
                    HandleErrorInfo errorModel;  
          
                    var routeData = new RouteData();  
                    routeData.Values["controller"] = "Utility";  
          
                    switch (httpStatusCode)  
                    {  
                        case 404:  
                            routeData.Values["action"] = "PageNotFound";  
                            errorModel = new HandleErrorInfo(new Exception(string.Format("No page Found", httpContext.Request.UrlReferrer), ex), "Utility", "PageNotFound");  
                            break;  
          
                        default:  
                            routeData.Values["action"] = "Error";  
                            Exception exceptionToReplace = null; //这里使用了EntLib的异常处理模块的一些功能  
                            shouldHandleException = ExceptionPolicy.HandleException(ex, "LogAndReplace", out exceptionToReplace);  
                            errorModel = new HandleErrorInfo(exceptionToReplace, "Utility", "Error");  
                            break;  
                    }  
          
                    if (shouldHandleException)  
                    {  
                        var controller = new UtilityController();  
                        controller.ViewData.Model = errorModel; //通过代码路由到指定的路径  
                        ((IController)controller).Execute(new RequestContext(new HttpContextWrapper(httpContext), routeData));  
                    }  
                }  

     

     

     

     

    原文参考引自:http://blog.csdn.net/zjlovety/article/details/48734791

     

  • 相关阅读:
    解决CSS图片底部3像素问题总结
    常用伪元素及content属性值的使用
    javascript中用正则表达式判断是否为汉字及常用的判断
    javascript 正则表达式
    js常用事件
    js动态获取select选中的option
    innerHTML innerText与outerHTML间的区别
    vue的生命周期(又称钩子函数)----以及vue1.0版本与vue2.0版本生命周期的不同
    JavaScript实现表单验证_02
    JavaScript数组实现图片轮播
  • 原文地址:https://www.cnblogs.com/xiaoerlang90/p/5219805.html
Copyright © 2011-2022 走看看