说一说MVC的CustomHandlerErrorAttribute

九月第一篇,呵呵

前言:最近刚入职了一家公司,上司让我维护一个项目,我接手了看了一下项目,try catch 严重影响我的视觉,我直接通过vs插件将其try catch全部替换掉占位符,呵呵。

  所以我特此写了这篇文章...

正本:有可能你在搞开发的时候在每个模块中都要try catch,这样不仅不优雅也非常累,看了这篇文章,你会有所收获,你将会从50行代码收缩成30行.当然这取决于你的逻辑。

在CustomHandlerErrorAttribute中要继承HandleErrorAttribute

HandleErrorAttribute.cs

复制代码

#region 程序集 System.Web.Mvc, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
#endregion

namespace System.Web.Mvc
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class HandleErrorAttribute : FilterAttribute, IExceptionFilter
    {
        public HandleErrorAttribute();
        public Type ExceptionType { get; set; }
        public string Master { get; set; }
        public override object TypeId { get; }
        public string View { get; set; }
        public virtual void OnException(ExceptionContext filterContext);
    }
}

复制代码

人们常说虚方法都是可以重写的,也就是说你可以去扩展它.看代码CustomHandlerErrorAttribute.cs

 

 为什么我在这里截图呢,我是害怕别人复制黏贴,当然这不是我小气,因为很多人百度 都太懒了,也希望你们尊重博主的劳动成功

这样只要程序抛出异常,或者错误就换到自定义错误过滤器,这种形式也可以叫做短路器,当然不只是包括action的行为,如果是ajax请求报错,我们直接返回json,例如服务器崩掉。我们看一下测试过程。为了测试方便我直接把IIS启动起来了。

我们先看一下最简单的出错:

public ActionResult ExceptionUnCatch()
{
  throw new Exception("ExceptionCatch");
  return View();
}

 

@{
    ViewBag.Title = "ExceptionUnCatch";
}

<h2>ExceptionUnCatch</h2>

 

结果

经过测试也是成功跳入我的自定义错误过滤器,通过给action添加特性,才会使ASP.NET MVC 的生命周期中包括了我的过滤器。但是我们看另一种情况.我们加上try catch 呢?

复制代码

 public ActionResult ExceptionCatch()
        {
            try
            {
                throw new Exception("ExceptionCatch...");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            return View();
        }

复制代码

视图方面:

@{
    ViewBag.Title = "ExceptionCatch";
}

<h2>ExceptionCatch</h2>

 可以发现错误被catch掉了,那如果我们在页面中抛出了异常呢.我们不去说view中会出什么异常,直接在代码中添加代码块<h1>@{throw new Exception("Exception View");}</h1>,经过我的测试,它也是成功的返回错误信息。

自习看过我的代码你会发现我在过滤器中添加了一个ajax请求的异常处理,我们简单的测试一下.在视图上定义了一个action  里面指向参数   我并没有那些控制器或action!!<h1>@Html.ActionLink("asdsa","asdsa")</h1>

结果   

 

最后在FilterConfig.cs中对所有action生效

复制代码

  public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
            //filters.Add(new CustomAuthorizeAttribute());//3 全局注册,全部的控制器/action都生效
            filters.Add(new CustomHandlerErrorAttribute());//
        }

复制代码

 

 但是处理不到的情况就有了,例如在控制器构造函数中抛出异常或者说访问的url不存在

 

总来来说是因为它们是管道级别错误,不属于acton行为级别 ,这种情况我们只能借助配置项来对错误进行封装

在system.web中添加

 <customErrors mode="On" defaultRedirect="~/Demo.html">
      <error statusCode="404" redirect="~/Demo.html"/>
    </customErrors>

另一种方式可以在global.asax.cs中添加Application.error或许你应该懂了吧?

复制代码

protected void Application_Error(object sender,EventArgs args)
{
     var errorDetail = Server.GetLastError();
     Context.Response.Write(errorDetail);
     Server.ClearError();
}

复制代码

总结:使用自定义错误过滤器配合全局错误就可以达到非常好的错误处理。

http://www.cgpwyj.cn/
http://news.cgpwyj.cn/
http://item.cgpwyj.cn/
http://www.peacemind.com.cn/
http://news.peacemind.com.cn/
http://item.peacemind.com.cn/
http://www.tasknet.com.cn/
http://news.tasknet.com.cn/
http://item.tasknet.com.cn/
http://www.ownbar.cn/
http://news.ownbar.cn/
http://item.ownbar.cn
http://www.shtarchao.net.cn/
http://news.shtarchao.net.cn/
http://item.shtarchao.net.cn/
http://www.metroworld.com.cn/
http://news.metroworld.com.cn/
http://item.metroworld.com.cn/
http://www.cngodo.cn/
http://news.cngodo.cn/
http://item.cngodo.cn/
http://www.gzrdbp.cn/
http://news.gzrdbp.cn/
http://item.gzrdbp.cn/
http://www.dnapt.cn/
http://news.dnapt.cn/
http://item.dnapt.cn/
http://www.ncxlk.cn/
http://news.ncxlk.cn/
http://item.ncxlk.cn/
http://www.zgxxyp.cn/
http://news.zgxxyp.cn/
http://item.zgxxyp.cn/
http://www.sjjdvr.cn/
http://news.sjjdvr.cn/
http://item.sjjdvr.cn/
http://www.sujinkeji.cn/
http://news.sujinkeji.cn/
http://item.sujinkeji.cn/
http://www.zsjxbd.cn/
http://news.zsjxbd.cn/
http://item.zsjxbd.cn/
http://www.yesgas.cn/
http://news.yesgas.cn/
http://item.yesgas.cn/
http://www.quickpass.sh.cn/
http://news.quickpass.sh.cn/
http://item.quickpass.sh.cn/
http://www.jspcrm.cn/
http://news.jspcrm.cn/
http://item.jspcrm.cn/
http://www.yjdwpt.cn/
http://news.yjdwpt.cn/
http://item.yjdwpt.cn/
http://www.henanwulian.cn/
http://news.henanwulian.cn/
http://item.henanwulian.cn/
http://www.hhrshh.cn/
http://news.hhrshh.cn/
http://item.hhrshh.cn/
http://www.gpgold.cn/
http://news.gpgold.cn/
http://item.gpgold.cn/
http://www.jingzhuiyou.cn/
http://news.jingzhuiyou.cn/
http://item.jingzhuiyou.cn/ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值