当前位置: 首页 > news >正文

ASP.NET MVC3 异常处理

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的值可以是OffOnRemoteOnly,不同的值定义研发阶段或产品发布后的行为。

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必须对每个actioncontroller手工定义。

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

<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("出错.");
}
 

相关文章:

  • 解决【Unable to make the session state request to the session state server】
  • 如何在IIS里对网站限速
  • msxml3.dll 错误 '80072efd' A connection with the server could not be established
  • 解决IE6浏览器中Div层挡不住Select组件
  • 解决IE6下select z-index 无效
  • Ubuntu下gcc安装及使用
  • Linux(ubuntu)下手动安装 firefox 6 并且添加快捷方式图标
  • ubuntu下如何安装使用SSH
  • 解决 WinSCP 内部编辑器中文乱码问题
  • ubuntu摄像头软件--茄子大头贴
  • 安装ubuntu-tweak
  • 在Ubuntu 中安装VLC
  • Ubuntu 12.04中文输入法的安装
  • 图解ubuntu中修改计算机名
  • ubuntu nano操作
  • Brief introduction of how to 'Call, Apply and Bind'
  • js中forEach回调同异步问题
  • Python - 闭包Closure
  • python_bomb----数据类型总结
  • React+TypeScript入门
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue-cli3搭建项目
  • 测试开发系类之接口自动化测试
  • 扑朔迷离的属性和特性【彻底弄清】
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 再次简单明了总结flex布局,一看就懂...
  • postgresql行列转换函数
  • 选择阿里云数据库HBase版十大理由
  • !!java web学习笔记(一到五)
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #define、const、typedef的差别
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (6)STL算法之转换
  • (C#)一个最简单的链表类
  • (libusb) usb口自动刷新
  • (二)斐波那契Fabonacci函数
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (算法)Game
  • (算法设计与分析)第一章算法概述-习题
  • (已解决)什么是vue导航守卫
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .net CHARTING图表控件下载地址
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET 指南:抽象化实现的基类
  • .net知识和学习方法系列(二十一)CLR-枚举
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @hook扩展分析
  • @media screen 针对不同移动设备