• 浅谈MVC异常处理


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

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

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

    1         public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    2         {
    3             filters.Add(new HandleErrorAttribute());
    4         }

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

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

    例如:一下是Error.cshtml。

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

    1     public class HomeController : Controller
    2     {
    3         public ActionResult Index()
    4         {
    5             string i = "12a";
    6             int j = Convert.ToInt32(i);
    7             return View();
    8         }
    9     }

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

    以上就是运行的结果,我们可以看到,System.Web.Mvc.HandleErrorInfo类还是有很多丰富的属性的,我们可以直接拿来用。

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

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

     1 namespace Exception.Controllers
     2 {
     3     public class SharedController : Controller
     4     {
     5         // GET: Shares
     6         public ActionResult Error()
     7         {
     8             return View();
     9         }
    10 
    11         public ActionResult NotFondError()
    12         {
    13             return View();
    14         }
    15     }
    16 }

    页面:

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

    二、重写MVC中的异常处理

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

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

     1     public class CustomHandleErrorAttribute : HandleErrorAttribute
     2     {
     3         public override void OnException(ExceptionContext filterContext)
     4         {
     5             base.OnException(filterContext);
     6             var err = filterContext.Exception.Message;//错误内容
     7             //=============================
     8             //将错误记录到日志中
     9             //=============================
    10         }
    11     }

    然后,将FilterConfig.cs加入:

    1     public class FilterConfig
    2     {
    3         public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    4         {
    5             filters.Add(new HandleErrorAttribute());
    6             filters.Add(new CustomHandleErrorAttribute());
    7         }
    8     }

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

  • 相关阅读:
    为aptget设置http代理[转]
    tty&pty
    Overfencing
    ubuntu修改runlevel
    ls l文件类型[转]
    ubuntu文字界面与图形界面切换
    ubuntu没有/etc/inittab文件
    linux一些缩写的意思
    redhat server 5.4安装中文
    关闭linux警报
  • 原文地址:https://www.cnblogs.com/xiaomowang/p/6890474.html
Copyright © 2020-2023  润新知