九月第一篇,呵呵

前言:最近刚入职了一家公司,上司让我维护一个项目,我接手了看了一下项目,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="" 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();
}

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

说一说MVC的CustomHandlerErrorAttribute(五)的更多相关文章

  1. ASP.NET MVC Model验证(五)

    ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...

  2. ASP.NET MVC Model绑定(五)

    ASP.NET MVC Model绑定(五) 前言 前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了讲解,本篇将会对IValueProvider的使用做个基础的示例讲解,读完本 ...

  3. ASP.NET MVC Model元数据(五)

    ASP.NET MVC Model元数据(五) 前言 在上一篇中我们描述了应用于Model上面的各种用于显示控制的特性类,在本篇中将详细的介绍这些特性类的应用,虽然它们跟Model元数据的直接关系并不 ...

  4. Mvc项目实例 MvcMusicStore 五

    Mvc项目实例 MvcMusicStore 一Mvc项目实例 MvcMusicStore 二Mvc项目实例 MvcMusicStore 三Mvc项目实例 MvcMusicStore 四Mvc项目实例 ...

  5. 2017.3.31 spring mvc教程(五)Action的单元测试

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  6. ASP.NET MVC学习(五)之MVC原理解析

    ASP.NET MVC 请求生命周期 生命周期步骤概览 当我们对ASP.NET MVC网站发出一个请求的时候,会发生5个主要步骤: 步骤1:创建RouteTable 当ASP.NET应用程序第一次启动 ...

  7. ASP.NET MVC学习---(五)MVC初体验

    经过之前n多的铺垫 我们已经大概了解了这个姓m名vc的家伙了 那么今天我们就来体验一把 怎么体验呢? 就来做一个小例子吧~ mvc增删改查的例子 数据库还是之前我们的老朋友 关系图: 表中的数据已填好 ...

  8. MVC系列学习(十五)-验证码

    1.方式一: public class VCode { /// <summary> /// 生成验证码图片 字节数组 /// </summary> /// <return ...

  9. 说一说MVC的MenuCard(五)

    1.数据库设计 create database BookShop go use bookshop go --模块表 create table Module ( ModuleID ,), ModuleN ...

随机推荐

  1. Mac上使用jenkins+git持续集成浅析

    本文旨在让同学们明白如何让jenkis在mac笔记本上运行,并实际与一个最简单的git地址交互并执行简单的jenkins任务,如果学习本文,需要先按照https://www.cnblogs.com/x ...

  2. 【QT】QApplication简介

    1.QApplication QApplication类管理GUI程序的控制流和主要设置,是基于QWidget的,为此特化了QGuiApplication的一些功能,处理QWidget特有的初始化和结 ...

  3. 【C语言编程练习】5.7填数字游戏求解

    之前的东西就不上传了,大致就跟现在的一样 1. 题目要求 计算 ABCD *  E DCBA 这个算式中每个字母代表什么数字? 2. 题目分析 如果是我们人去做这道题会怎么办,一定是这样想把,一个四位 ...

  4. hadoop hdfs ha 模式

    这是我自己在公司一个搭建公司大数据框架是自己的选项,在配置yarn ha 出现了nodemanager起不来的问题于是我把yarn搭建为普通yarn 如果有人解决 高yarn的nodemanager问 ...

  5. 使用ant编译zookeeper源码

    1. 安装Ant Ant下载地址:http://ant.apache.org/bindownload.cgi 解压即可. 注意如果不配置环境变量的话需要使用绝对路径,我配置了. 开始我ant跑错了 U ...

  6. login shell 和 non-login shell 的区别

              login shell:去的bash时需要完整的登录流程.就是说通过输入账号和密码登录系统,此时取得的shell称为login shell non-login shell:取得sb ...

  7. 《SpringMVC从入门到放肆》十四、SpringMVC分组数据校验

    上一篇我们学习了数据校验,但是在实际项目中,还是有些不够灵活,今天我们就来继续学习一种更灵活的数据校验方法——分组数据校验. 一.什么是分组校验 校验规则是定义在实体中的,而同一个实体可以被多个Con ...

  8. hadoop伪分布式搭建

    安装好jdk 减压hadoop压缩包 cd /home/hadoop/hadoop-2.7.3/etc/hadoop vi hadoop-env.sh 文件末尾处添加 jdk环境变量 export J ...

  9. Xaml Controls Gallery 的五个没有用的控件

    HyperlinkButton 功能:这个控件可以实现点击按钮后跳到另一个按钮的功能. 我觉得这个功能有些多余,据我了解,一些深受欢迎的游戏大都具备的一个特点,那就是操作简单,界面中不会出现冗余的东西 ...

  10. [转] Quality Of Service In OpenStack

    http://tropicaldevel.wordpress.com/2013/07/15/quality-of-service-in-openstack/ In this post I will b ...