这篇文章主要为大家详细介绍了MVC异常处理的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在日常开发中,我们会去捕捉很多的异常,来进行处理,通常我们的方法就是,在需要进行异常处理的地方加上 try catch 块,但是,如果需要异常处理的地方很多,那么,就会频繁的去写try catch 块,对于我们天生‘懒惰' 的程序员来说,总想找一个捷径。于是,就会有全局异常处理,那么,今天,我们就来看看在MVC中怎么进行全局异常处理的。

一、MVC框架自己的全局异常处理

  在MVC中,框架已经给我们一共了一套全局异常处理的特性类HandleErrorAttribute类。我们可以在MVC中的App_Start文件夹中的FilterConfig.cs文件中找到这么一行代码


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

这个就是实例化一个HandleErrorAttribute类,放到过滤器中。然后我们的Views>Shared文件夹中有一个Error.cshtml的页面,其中,该页面里的Model的类型为System.Web.Mvc.HandleErrorInfo,这个是MVC框架已经给我写好了的,我们可以直接拿来用。

在Error.cshtml页面中,我们可以做进一步处理,来显示错误信息,根据需求来展示错误信息。这些错误信息都会在System.Web.Mvc.HandleErrorInfo类中的某些属性中找到的。

例如:一下是Error.cshtml。

我们在Control中,故意写一个异常出来:


public class HomeController : Controller  {    public ActionResult Index()    {      string i = "12a";      int j = Convert.ToInt32(i);      return View();    }  }

运行一下,我们来看一下结果。

MVC自带的这套异常处理默认的是处理错误码为500系列的异常,如果是404,就不会走这个了。不过,我们可以通过Web.config文件的设置,来进行处理。看我们如何处理的。

首先,我们先将Error.cshtml页补充完整,先给他加一个Control,然后,我们再写一个专门处理404的View和Control。如下


namespace Exception.Controllers{  public class SharedController : Controller  {    // GET: Shares    public ActionResult Error()    {      return View();    }    public ActionResult NotFondError()    {      return View();    }  }}

页面:

然后我们在浏览器地址中写一个错误的地址,看一下结果:

二、重写MVC中的异常处理

在开发中,我们经常有这么一个需求,我们需要将异常通过文本日志的方式记录下来并保存,那么MVC自带的异常处理方式System.Web.Mvc.HandleErrorInfo没有这么一个功能,那么我们通过重写的方式来让它有这个功能。下面,我们来看看如何重写。

首先我们建一个类,让这个类继承System.Web.Mvc.HandleErrorInfo,然后重写System.Web.Mvc.HandleErrorInfo中的虚方法:OnException方法。


public class CustomHandleErrorAttribute : HandleErrorAttribute  {    public override void OnException(ExceptionContext filterContext)    {      base.OnException(filterContext);      var err = filterContext.Exception.Message;//错误内容      //=============================      //将错误记录到日志中      //=============================    }  }

然后,将FilterConfig.cs加入:


public class FilterConfig  {    public static void RegisterGlobalFilters(GlobalFilterCollection filters)    {      filters.Add(new HandleErrorAttribute());      filters.Add(new CustomHandleErrorAttribute());    }  }

这样,我们就可以完成我们的需求了。

更多相关文章

  1. c++如何设置全局变量
  2. C语言中在main函数中定义的变量是全局变量么
  3. golang-cache是全局吗
  4. 关于Golang 全局sql数据库连接
  5. Spring Boot 工程集成全局唯一ID生成器 Vesta
  6. Spring Boot工程集成全局唯一ID生成器 UidGenerator
  7. PHP 超全局变量之$_FILES详解
  8. PHP使用Composer进行注册全局函数
  9. php之管理全局状态

随机推荐

  1. XML实体扩展攻击代码实例分享
  2. XML开发环境的建立详解
  3. xml模版,自定义按钮背景
  4. 详解lxml处理xml时的字符编码问题
  5. XML概述以及Pull解析的示例代码
  6. 详细介绍Linq读取XML的示例代码
  7. XML的简介与开发详解(图文)
  8. XML文件解析汇总SAX/DOM/PULL的详细介绍
  9. XmlDocument操作xml文档的示例代码
  10. XML解析中的namespace初步了解