MVC使用HandleErrorAttribute自定义异常
MVC中,有一个Filter可以捕捉错误,但是它的用法是利用Attribute来实现的,而且只能加在Controller和Action上,所以不能捕捉别出的错误
其实理论上所有的错误肯定产生于Controller中,但有2种情况下,就不会被捕捉了
1、页面不存在的时候,找不到对应的Controller,那没有任何Controller被执行,所以自然也不会捕捉到错误了
2、在 IAuthorizationFilter 下发生错误的时候,错误捕捉代码在IExceptionFilter中,而IAuthorizationFilter的优先权高于IExceptionFilter,所以也就捕捉不到了
一、HandleError的使用
1、设置HandleError属性
可以通过设置下面这些属性来更改HandleErrorAttribute特性的默认处理:
ExceptionType.指定过滤器处理那种或哪些类型的异常,如果没有指定该属性,过滤器将会处理所有的异常.
View.指定发生异常时过滤器要显示的视图名称.
Master.指定视图母版的名称,如果有的话.
Order.指定过滤器应用的顺序,如果一个Action有多个HandleErrorAttribute过滤器.
2、指定Order属性
如果某个Action设置了多个HandleErrorAttribute,Order属性可以用来确定使用哪个过滤器.其值可以设置为从-1(最高优先级)到任何正整数之间的整数来标识其优先级,值越大,优先级别越低.Order属性遵循以下规则:
应用到Controller上的过滤器将会自动应用到该Controller的所有Action上.
如果Controller和Action都应用了HandleErrorAttribute,那么只要Order属性值相同,将会先执行Controller上的过滤器,而后才会执行Action上的过滤器.
对于相同Order属性的过滤器,其执行先后次序不定.
如果没有指定Order属性,则默认为-1,这意味着该过滤器将比其他的过滤器优先执行,除非其他过滤器指定了Order为-1.
如果有多个过滤器可适用,那么第一个可以处理该异常的过滤器会被首先调用,然后针对该异常的处理将会终结.
3、在View中获取异常信息
ASP.NET MVC框架将异常信息存储在ViewDataDictionary中来传递给Error视图,该ViewDataDictionary的Model属性即是ExceptionContext类的一个实例,这个ViewData有下面几个键:
ActionName:目标Action方法的名称
ControllerName:目标Controller的名称
Exception:异常对象.
二、使用HandleErrorAttribte类处理异常及步骤
1、可以通过下列两种方式选择一种处理异常
(1)、在类或者方法上直接使用HandleError属性来定义

 
// 在这里声明

[HandleError]

public class HomeController : Controller

{
 // 或者在这里声明
    // 或者在这里声明
 // [HandleError]
    // [HandleError]
 public ActionResult Index()
    public ActionResult Index()
 {
    {
 return View();
        return View();
 }
    }
 }
}

(2)、使用MVC3的Global Filters功能来注册,默认新建MVC项目在Global.asax文件里就已经有了
代码如下:

 
public static void RegisterGlobalFilters(GlobalFilterCollection filters)

{
 filters.Add(new HandleErrorAttribute());
    filters.Add(new HandleErrorAttribute());
 }
}

 public static void RegisterRoutes(RouteCollection routes)
public static void RegisterRoutes(RouteCollection routes)
 {
{
 routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

 routes.MapRoute(
    routes.MapRoute(
 "Default", // Route name
"Default", // Route name
 "{controller}/{action}/{id}", // URL with parameters
"{controller}/{action}/{id}", // URL with parameters
 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
 );
    );

 }
}

 protected void Application_Start()
protected void Application_Start()
 {
{
 AreaRegistration.RegisterAllAreas();
    AreaRegistration.RegisterAllAreas();

 RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterGlobalFilters(GlobalFilters.Filters);
 RegisterRoutes(RouteTable.Routes);
    RegisterRoutes(RouteTable.Routes);
 }
}

代码段里的filters.Add(new HandleErrorAttribute());设置是说整个程序所有的Controller都使用这个HandleErrorAttribute来处理错误。
2、开启web.config根目录里的customErrors(不是views目录下的那个web.config)
代码如下:
<customerrors mode="On" defaultredirect="~/Error/HttpError">
<error redirect="~/Error/NotFound" statuscode="404" />
</customerrors>
defaultredirect是设置为所有错误页面转向的错误页面地址,而里面的error元素可以单独定义不同的错误页面转向地址,上面的error行就是定义404所对应的页面地址。
3、定义我们所需要的错误页面的ErrorController:
public class ErrorController : BaseController
{
//
// GET: /Error/
public ActionResult HttpError()
{
return View("Error");
}
public ActionResult NotFound()
{
return View();
}
public ActionResult Index()
{
return RedirectToAction("Index", "Home");
}
}
默认Error的view是/views/shared/Error.cshtml文件,我们来改写一下这个view的代码,代码如下:
@model System.Web.Mvc.HandleErrorInfo
@{
ViewBag.Title = "General Site Error";
} <h2>A General Error Has Occurred</h2> @if (Model != null)
{
<p>@Model.Exception.GetType().Name<br />
thrown in @Model.ControllerName @Model.ActionName</p>
<p>Error Details:</p>
<p>@Model.Exception.Message</p>
}
三、使用 handleError attribute 有以下局限:
1. 不支持exception记录
2. 无法捕捉到500之外的http exception
3. controller之外抛出的异常无法处理
4. ajax调用出现exception时,会将错误页面内容返回
http://www.studyofnet.com/news/316.html
MVC使用HandleErrorAttribute自定义异常的更多相关文章
- 【转载】MVC使用HandleErrorAttribute自定义异常
		本文导读:在ASP.NET MVC中,可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了HandleErrorAttribute特 ... 
- MVC过滤器:自定义异常过滤器使用案例
		在上一篇文章中讲解了自定义异常过滤器,这篇文章会结合工作中的真实案例讲解一下如何使用自定义异常过滤器. 一.需求 本案例要实现的功能需求:在发生异常时记录日志,日志内容包括发生异常的Controlle ... 
- MVC过滤器:自定义异常过滤器
		一.异常过滤器 异常筛选器用于实现IExceptionFilter接口,并在ASP.NET MVC管道执行期间引发了未处理的异常时执行.异常筛选器可用于执行诸如日志记录或显示错误页之类的任务.Hand ... 
- MVC 使用HandleErrorAttribute统一处理异常
		HandleErrorAttribute继承自FilterAttribute,且实现了IExceptionFilter接口. 属于AOP思想的一种实现,MVC的四大筛选器(权限,动作,结果,异常)中的 ... 
- 自定义Exception:MVC抛出自定义异常,并以Json方式返回
		相关链接 优点: 可以统一处理所有页面的异常,对所有需要返回json数据的异常,都用同样的方法throw new DVMException().页面展示,controller的错误处理方式一样 节省编 ... 
- MVC扩展Filter,通过继承HandleErrorAttribute,使用log4net或ELMAH组件记录服务端500错误、HttpException、Ajax异常等
		□ 接口 public interface IExceptionFilter{ void OnException(ExceptionContext filterContext);} Except ... 
- 第四节:MVC中AOP思想的体现(四种过滤器)并结合项目案例说明过滤器的实际用法
		一. 简介 MVC中的过滤器可以说是MVC框架中的一种灵魂所在,它是MVC框架中AOP思想的具体体现,所以它以面向切面的形式无侵入式的作用于代码的业务逻辑,与业务逻辑代码分离,一经推出,广受开发者的喜 ... 
- spring mvc 总结
		依赖包 <!-- spring依赖 --> <dependency> <groupId>org.springframework</groupId> &l ... 
- SpringMVC中的异常处理集锦
		1 描述 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合 ... 
随机推荐
- 执行 apt-get -f install 提示错误
			执行 apt-get -f install 提示错误 分类: Linux 2015-01-24 21:26 554人阅读 评论(0) 收藏 举报 1. 问题: usloft1359:~# rvm in ... 
- tinkphp5.0 traits  的引入
			Traits引入 ThinkPHP 5.0开始采用trait功能(PHP5.4+)来作为一种扩展机制,可以方便的实现一个类库的多继承问题. trait是一种为类似 PHP 的单继承语言而准备的代码复用 ... 
- CodeForces 616D Longest k-Good Segment
			用队列维护一下即可 #include<cstdio> #include<cstring> #include<queue> #include<algorithm ... 
- codeforce 611B New Year and Old Property
			暴力搞 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> u ... 
- php命名空间如何引入一个变量类名?
			例子如下: $className = 'Test'; 正常 new \Require\allClass\Test(); 当然OK,但是 new \Require\allClass\$className ... 
- IP组播技术介绍及实现例子
			引 言 近年来,随着Internet的迅速普及和爆炸性发展,在Internet上产生了许多新的应用,其中不少是高带宽的多媒体应用,譬如网 络视频会议.网络音频/视频广播.AOD/VOD.股市行情发布. ... 
- typedef和block
			为block类型对象取别名 1.没有使用typedef的情况 int (^block_add)(int, int) = ^(int value1, int value2) { return value ... 
- CSDN泄漏数据完整分析
			CSDN泄漏数据完整分析 2011-12-22 08:59:26 53391 次阅读 0 条评论 感谢mayee的投递 昨天CSDN的用户数据库被人在网上公布.我下载分析了下里面的数据,得出了一些很有 ... 
- webstrom命令大全
			Ctrl + Space:Basic code completion (the name of any class, method or variable) 基本代码完成(任何类.函数或者变量名称), ... 
- 微信公众号支付开发全过程 --JAVA
			按照惯例,开头总得写点感想 ------------------------------------------------------------------ 业务流程 这个微信官网说的还是很详细的 ... 
