一、概述

MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面;

二、使用步骤:

1、配置WebConfig文件,在System.Web节点下加上

  1. <customErrors mode="On"  defaultRedirect="~/Shared/Error" />

翻阅一些大神写的博客,在他们的博客中指出defaultRedirect是指向错误页面的URL,可是经过本人测试的时候,发现在MVC4中这种说法并不准,在MVC中,有一套默认的机制(这部分代码被微软封装,无法阅读),该机制能够把错误信息通过HandleError属性指向Shared/Error页面,也就是说配置System.Web节点,可以省略defaultRedirect

  1. customErrors mode="On"/>

2、Global文件,添加HandleEffor属性

  1. public static void RegisterGlobalFilters(GlobalFilterCollection filters)
  2. {
  3. filters.Add(new HandleErrorAttribute(),1);
  4. }

在Global定义之后,也就是全局定义,其他Action和Control都不需要定义,默认使用HandleError控制属性;

这样就可以使用MVC4中系统默认的Error页面;

三、自定义错误页面

  有些时候,我们想使用自定义的错误页面,该怎么处理那,翻页其他大牛写的博客,看到有这种方式,自定义属性Class继承FileterAttribute,重写OnException方法,代码如下

  1. public class BaseHandleErrorAttribute : FilterAttribute, IExceptionFilter
  2. {
  3. public void OnException(ExceptionContext filterContext)
  4. {
  5. if (filterContext.ExceptionHandled == true)
  6. {
  7. HttpException httpExce = filterContext.Exception as HttpException;
  8. if (httpExce != null && httpExce.GetHttpCode() != 500)//为什么要特别强调500 因为MVC处理HttpException的时候,如果为500 则会自动将其ExceptionHandled设置为true,那么我们就无法捕获异常
  9. {
  10. return;
  11. }
  12. }
  13. Exception exception = filterContext.Exception;
  14. if (exception != null)
  15. {
  16. HttpException httpException = exception as HttpException;
  17. if (httpException != null)
  18. {
  19. //网络错误
  20. filterContext.Controller.ViewBag.UrlRefer = filterContext.HttpContext.Request.UrlReferrer;
  21. int DataEroorCode = httpException.GetHttpCode();
  22. if (DataEroorCode == 404)
  23. {
  24. filterContext.HttpContext.Response.Redirect("~/SysError/404");
  25. }
  26. else if (DataEroorCode == 500)
  27. {
  28. filterContext.HttpContext.Response.Redirect("~/SysError/500");
  29. }
  30. else
  31. filterContext.HttpContext.Response.Redirect("~/SysError/" + DataEroorCode);
  32.  
  33. //写入日志 记录
  34. filterContext.ExceptionHandled = true;//设置异常已经处理
  35. }
  36. else
  37. {
  38. //编程或者系统错误,不处理,留给HandError处理
  39. }
  40. }
  41. }
  42. }

将该属性注册到全局Global中,定义铺货异常等级

  1. public static void RegisterGlobalFilters(GlobalFilterCollection filters)
  2. {
  3. filters.Add(new BaseHandleErrorAttribute(),0);
  4.  
  5. filters.Add(new HandleErrorAttribute(),1);
  6.  
  7. }

当然我们也可以不使用MVC框架自带的Error页面,定义一个Error404,如何使用这个页面那 ,起始也挺简单的,代码如下

  1. public static void RegisterGlobalFilters(GlobalFilterCollection filters)
  2. {
  3. filters.Add(new BaseHandleErrorAttribute(),0);
  4.  
  5. filters.Add(new HandleErrorAttribute(View="Error404"),1);
  6.  
  7. }

四、遇到问题总结

1、遇到重定向,URL指向aspxerrorpath,如:

http://local:8090/error/error.htm?aspxerrorpath=/cmt/p/3789549.html

出现这个问题的主要原因:

1>、Global没有添加

filters.Add(new HandleErrorAttribute(View="Error404"))

2>、Shared目录没有Error页面;

3>、如果存在Error页面,但是页面是用了布局Layout,组成的Error页面存在错误,比如ModeView数据不对等,需要详查;

2、自定义Error的其他方式

翻页其他大牛写的文章时候,返现也可以使用Gloal中的Application_Error事件方法处理,比如博主@dudu写的异常处理方式;

代码粘贴如下:

  1. protected void Application_Error(Object sender, EventArgs e)
  2. {
  3. var lastError = Server.GetLastError();
  4. if (lastError != null)
  5. {
  6. var httpError = lastError as HttpException;
  7. if (httpError != null)
  8. {
  9. //ASP.NET的400与404错误不记录日志,并都以自定义404页面响应
  10. var httpCode = httpError.GetHttpCode();
  11. if (httpCode == 400 || httpCode == 404)
  12. {
  13. Response.StatusCode = 404;//在IIS中配置自定义404页面
  14. Server.ClearError();
  15. return;
  16. }
  17. Logger.Default.Error("Application_Error_" + httpCode, httpError);
  18. }
  19.  
  20. //对于路径错误不记录日志,并都以自定义404页面响应
  21. if (lastError.TargetSite.ReflectedType == typeof(System.IO.Path))
  22. {
  23. Response.StatusCode = 404;
  24. Server.ClearError();
  25. return;
  26. }
  27.  
  28. Logger.Default.Error("Application_Error", lastError);
  29. Response.StatusCode = 500;
  30. Server.ClearError();
  31. }
  32. }

实现样式多样,只要实现功能就是最好;

原文:http://www.cnblogs.com/xibei666/p/5153807.html

MVC4 自定义错误页面(转)的更多相关文章

  1. MVC4 自定义错误页面(三)

    一.概述 MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面: 二.使用步骤: 1.配置WebConfig文件,在System.We ...

  2. ASP.NET Core中显示自定义错误页面-增强版

    之前的博文 ASP.NET Core中显示自定义错误页面 中的方法是在项目中硬编码实现的,当有多个项目时,就会造成不同项目之间的重复代码,不可取. 在这篇博文中改用middleware实现,并且放在独 ...

  3. ASP.NET Core中显示自定义错误页面

    在 ASP.NET Core 中,默认情况下当发生500或404错误时,只返回http状态码,不返回任何内容,页面一片空白. 如果在 Startup.cs 的 Configure() 中加上 app. ...

  4. ASP.NET全局错误处理和异常日志记录以及IIS配置自定义错误页面

    应用场景和使用目的 很多时候,我们在访问页面的时候,由于程序异常.系统崩溃会导致出现黄页.在通常的情况下,黄页对于我们来说,帮助是极大的,因为它可以帮助我们知道问题根源,甚至是哪一行代码出现了错误.但 ...

  5. haproxy实现自定义错误页面的内容

    现在利用haproxy实现自定义的haproxy的错误页面 我们现在实现自定义错误页面有以下的方法: 一种是自定义错误页面 haproxy.conf defaults errorfile 404 /e ...

  6. ASP.NETMVC自定义错误页面真的简单吗?

    Note:文章前半部分翻译自 http://benfoster.io/blog/aspnet-mvc-custom-error-pages ,着急的可直接看总结~ 如果你在设置asp.net mvc自 ...

  7. Spring Boot自定义错误页面,Whitelabel Error Page处理方式

    我已经是Spring Framework框架的忠实粉丝.对于企业软件开发者来说它提供了对常见问题的通用解决方案,包括那些你在未来开发中没有意识到的问题.但是,它构建的J2EE项目变得比较臃肿,需要被一 ...

  8. ASP.NET自定义错误页面

    ASP.NET自定义错误页面 ASP.NET 提供三种用于在出现错误时捕获和响应错误的主要方法:Page_Error 事件.Application_Error 事件以及应用程序配置文件 (Web.co ...

  9. ASP.NET网站中设置404自定义错误页面

    在用ASP.NET WebForm开发一个网站时,需要自定义404错误页面. 做法是这样的 在网站根目录下建立了一个404.html的错误页面,然后在Global.asax文件中,加入如下代码: &l ...

随机推荐

  1. java jni c++ 例子

    1. java程序 public class TestHello { static { System.loadLibrary("TestHello"); } public stat ...

  2. 高性能 Socket 组件 HP-Socket v3.2.1 正式发布

    HP-Socket 是一套通用的高性能 TCP/UDP Socket 组件,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C ...

  3. 深入理解Javascript中构造函数和原型对象的区别

    在 Javascript中prototype属性的详解 这篇文章中,详细介绍了构造函数的缺点以及原型(prototype),原型链(prototype chain),构造函数(constructor) ...

  4. JavaScript判断变量值简单的方法

    今天在看一个动态web表单设计器的时候发现项目中的 一个写法 function sum_total(v){ if (!v) { v= 0; } } !v  这是什么写法?不过可以肯定的是,这是一种判断 ...

  5. jQuery插件中文乱码解决办法

    修改jQuery插件源代码的时候,中文字符有时候会显示乱码,通常这个插件是老外写的,默认文件的编码格式ANSI格式,源代码写中文字符的时候就会显示乱码,解决方法就是将文件编码格式换成UTF-8格式 保 ...

  6. iOS Xcode, 解决“Could not insert new outlet connection: Could not find any information for the class named”的问题。

    在Xcode中,我们可以在StoryBoard编辑界面或者是xib编辑界面中通过“Control键+拖拽“的方式将某个界面元素和对应的代码文件连接起来,在代码文件中创建outlet. 不过,如果你的运 ...

  7. sp_executesql得到执行sql语句的返回值

    执行 sql语句,得到 变量的值 ' declare @Partition int; ); ); SET @SQLString = N'SELECT @RangeKeyOUT = $PARTITION ...

  8. 中断ORACLE数据库关闭进程导致错误案例

    昨晚下班的时候,我准备关闭本机的虚拟机上的ORACLE数据库后准备下班,但是由于我SecureCRT开了多个窗口,结果一不小心,疏忽之下在一个生产服务器上执行了shutdown immediate命令 ...

  9. ORA-01502: index ‘index_name' or partition of such index is in unusable state

    错误现象: 今天发布脚本时,一个表插入数据时报如下错误 ORA-01502: index ‘index_name' or partition of such index is in unusable ...

  10. 一个C语言问题

    在这个题目中,你需要编写一个c++程序,要求输出以下内容:000000010010.....11101111(输出0到31的每个数的二进制表示,每行一个,前面的0也必须输出!) 1)部分代码已经为你完 ...