ASP.NET MVC3 异常处理

在ASP.NET MVC中可以使用HandleError特性很容易的实现错误的处理。

使用HandleError Attribute,并且在web.config中设置CustomErrors,当程序中有未处理的异常时,可以定向到一个友好的视图页面。

首先,我们通过反编译HandleError中的OnException方法,看一看是如何实现的:

public virtual void OnException(ExceptionContext filterContext)
{
    if (filterContext == null)
    {
        throw new ArgumentNullException("filterContext");
    }
    if (!filterContext.IsChildAction && (!filterContext.ExceptionHandled && filterContext.HttpContext.IsCustomErrorEnabled))
    {
        Exception innerException = filterContext.Exception;
        if ((new HttpException(null, innerException).GetHttpCode() == 500) && this.ExceptionType.IsInstanceOfType(innerException))
        {
            string controllerName = (string) filterContext.RouteData.Values["controller"];
            string actionName = (string) filterContext.RouteData.Values["action"];
            HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
            ViewResult result = new ViewResult {
                ViewName = this.View,
                MasterName = this.Master,
                ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
                TempData = filterContext.Controller.TempData
            };
            filterContext.Result = result;
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = 500;
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
    }

}

从中我们可以看到,如果一个未被处理的异常没有标记为“Handled”并且启用了自定义错误处理,该错误会在此处被捕获处理。

Web.config中设置CustomError

CustomError定义自动处理异常的行为,如下所示:

<customErrors mode="On" defaultRedirect="~/Error/Unknown">

<error statusCode="404" redirect="~/Error/NotFound" />
    </customErrors>

Mode的值可以是Off、On、RemoteOnly,不同的值定义研发阶段或产品发布后的行为。

Mode值的使用场景:

  • On:开启自定义错误处理。
  • Off:关闭自定义错误处理,当发生异常时,就会看到ASP.NET的黄页信息。
  • RemoteOnly:如果在服务器上运行程序(http://localhost),当发生异常时,不会看到自定义异常信息,如果通过其他机器访问该程序,会看到自定义异常信息。该选项常用于开发人员调试程序,如果出现异常,开发人员可以通过本地访问来查看异常详细信息,而远程访问的用户看到的是自定义的异常。

注意:

如果使用了HandleError特性,并且启用了CustomError,当有未处理的异常发生时,MVC在被执行的HttpRequest的上下文中查找”Error”视图(当前Controler对应的View文件夹中或Shared文件夹中),并呈现给用户。在这种情况下,CustomError的”defaultRedirect”和”redirect”属性会失效。注意:如果找不到Error视图,会使用”defaultRedirect”和”redirect”的定向。

如果没有使用HandleError,并且启用了CustomError,当有未处理的异常发生时,会重定向到”defaultRedirect”和”redirect”属性指定的url,如上例的/Error/

Unknown

提示:ASP.N.NET MVC3中,默认对所有的Controller注册全局HandleError,因此不用担心应用程序中的Controller没有使用HandleError。在之前版本中没有全局过滤器,HandleError必须对每个action或controller手工定义。

在web.config的CustomError中,也可以设置当异常出现重新定向到一个静态页面,如下:

<customErrors mode="On" defaultRedirect="Custom404.htm">


    </customErrors>

注意:静态页面需要放到web网站根目录下,否则无法定向到。

异常处理时执行其他功能的方法:

1、重写Controller的OnException方法

如果我们不仅仅在出现异常时显示自定义的错误页面,需要记录错误日志,那么可以通过继承Controller类并重些OnException方法实现。如果我们MVC程序的所有Controller都需要记录日志,可以创建一个BaseController,重写OnExcetion方法,然后其他需要记录日志的Controller继承BaseController即可。例如:

public class BaseController : Controller

{

protected override void OnException(ExceptionContext filterContext)

{
// 此处进行异常记录,可以记录到数据库或文本,也可以使用其他日志记录组件。
// 通过filterContext.Exception来获取这个异常。
string filePath = @"D:\Temp\Exceptions.txt";
StreamWriter sw = System.IO.File.AppendText(filePath);
sw.Write(filterContext.Exception.Message);
sw.Close();
// 执行基类中的OnException
base.OnException(filterContext);

}

}

那么其他继承自BaseController的Controller就会实现记录错误日志的功能。

2、创建FilterAttribute

通过FilterAttribute,并把它添加到全局过滤器集合中就可以提供给整个应用程序使用,如果只需要在某几个Action中使用,可以在Controller的Action中添加此特性。

Filter定义如下:

public class LogExceptionFilterAttribute : FilterAttribute, IExceptionFilter

{
public void OnException(ExceptionContext filterContext)
{
// 添加记录日志代码
}
}

如果要应用给所有的Controller的所有Action,在Global.asax.cs中实现下面代码即可:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{filters.Add(new LogExceptionFilterAttribute());filters.Add(new HandleErrorAttribute());
}

或者给只需要使用此特性的Controller或Action添加 :

[LogExceptionFilter()]
public ActionResult About()
{throw new Exception("出错.");
}
 

参考文档:http://www.dotneat.net/2011/04/12/ErrorHandlingInASPNETMVC3.aspx

转载于:https://www.cnblogs.com/kinglau/archive/2011/10/17/2215362.html

ASP.NET MVC3 异常处理 学习笔记相关推荐

  1. ASP.NET Core 2 学习笔记(七)路由

    ASP.NET Core通过路由(Routing)设定,将定义的URL规则找到相对应行为:当使用者Request的URL满足特定规则条件时,则自动对应到相符合的行为处理.从ASP.NET就已经存在的架 ...

  2. ASP.NET Core 2 学习笔记(四)依赖注入

    原文:ASP.NET Core 2 学习笔记(四)依赖注入 ASP.NET Core使用了大量的依赖注入(Dependency Injection, DI),把控制反转(Inversion Of Co ...

  3. ASP.NET Core 2 学习笔记(三)中间件

    原文:ASP.NET Core 2 学习笔记(三)中间件 之前ASP.NET中使用的HTTP Modules及HTTP Handlers,在ASP.NET Core中已不复存在,取而代之的是Middl ...

  4. ASP.NET MVC 2 学习笔记二: 表单的灵活提交

    ASP.NET MVC 2 学习笔记二:  表单的灵活提交 前面说到有做到公司内部的一个请假系统,用的是ASP.NET MVC 2+Entity Framework.虽然EF(Entity Frame ...

  5. ASP.NET MVC3 及其学习资源

    今天,Scott 宣告了 ASP.NET MVC3,IIS Express, SQL CE4, Web Farm Framework, Orchard, WebMatrix 的发布. Announci ...

  6. asp.net core webAPI学习笔记(三)资源请求

    IDE 版本:Visual Studio 2017 15.9.7 asp.net core 版本 2.1.1 本文档说明需在 asp.net core webAPI学习笔记(一)项目搭建 的基础下进行 ...

  7. ASP.NET Core分布式项目实战(集成ASP.NETCore Identity)--学习笔记

    任务24:集成ASP.NETCore Identity 之前在 Index 页面写了一个 strong 标签,需要加个判断再显示,不然为空没有错误的时候也会显示 @if (!ViewContext.M ...

  8. ASP.Net WebForm温故知新学习笔记:二、ViewState与UpdatePanel探秘

    原文地址:http://www.cnblogs.com/edisonchou/p/3901559.html 开篇:经历了上一篇<aspx与服务器控件探秘>后,我们了解了aspx和服务器控件 ...

  9. python异常处理优点_python各类异常处理学习笔记

    print("============异常与工具===================") print("============一.异常基础============== ...

  10. ASP.NET MVC 个人学习笔记之 Controller传值

    2019独角兽企业重金招聘Python工程师标准>>> //ControllerViewBag.Message = "Modify this template to jum ...

最新文章

  1. 我和奇葩的故事之失联第七天
  2. vscode 免费视频教程
  3. 判断客户浏览器是否支持cookie
  4. 目前计算机病毒只有网络型病毒吗,在web.xml中使用()标签配置过滤器
  5. Spring MVC源码分析(一) 说明
  6. SpringBoot集成MyBatis-Plus分页插件
  7. chord协议模拟实现_VB.NET和单片机串口通信实现监控单片机数字量输入继电器输出模拟量输入模拟量输出...
  8. 15. (附加)链表中间节点(C++版本)
  9. java 打印数据_Java 中的打印流
  10. java开发是什么_java开发到底是做什么的
  11. vm虚拟机安装openWrt
  12. windows对图片进行标记处理等操作
  13. 钉钉小程序的坑 么有开启通讯录权限,导致后台报错“没有调用该接口的权限”
  14. 如何解除80端口被占用
  15. 【CSS】1203- 分享 20 个防御式 CSS 开发经验
  16. 基于惠斯顿电桥的压力传感器的解决方案
  17. (23)Linux基础-系统磁盘阵列raid
  18. 计算机专业英语谐音读法,英语48个音标中文谐音读法大全
  19. 《剑指offer》—— 42. 和为S的两个数字(Java)
  20. AutoCAD2018错误提示:“许可管理器不起作用或未正确安装”的解决办法

热门文章

  1. Eclipse 编码常用技巧【不断补充完善】
  2. C++11 实现defer功能(转载)
  3. javaSE基础知识 知识点(一)
  4. 2021全国计算机二级知识点,2021年度Dlypeq全国计算机等级考试二级公共基础知识点总结.doc...
  5. : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versi
  6. (day 17 - 快排)剑指 Offer 40. 最小的k个数
  7. 小程序素材抓取软件_小程序上新丨2020冬季产品图库更新,海量素材随你用!...
  8. Django:报错 unsupported format character ‘Y‘ (0x59) at index 70
  9. wextend matlab,小波学习之三(多孔算法与MATLAB swt剖析)转载
  10. 使用Cmder替换cmd,让你的开发飞起来