65.9K
CodeProject 正在变化。 阅读更多。
Home

MVC 中的异常处理

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (11投票s)

2016年8月16日

CPOL

2分钟阅读

viewsIcon

29270

downloadIcon

418

全局异常处理,使用 Try...Catch 块处理异常,HandleError 属性

引言

让我们首先确定代码的目的是什么。

对于这篇文章,代码的目的是如何在MVC中处理异常,在MVC中处理异常的不同方法以及哪种方法最适合哪种情况。

** 使用 Try...Catch 块的简单方法 **

这是最基本的异常处理级别。 也称为方法级异常处理。

什么是 Try Catch 块?

try 块包含可能发生异常的代码块。 Catch 块将捕获在 try 块中发生的异常。

Try...Catch 的语法

try
{
    //Your Code
}
catch(ExceptionType ObjectName)
{
    //Code for Handle Exception
}
        public ActionResult EXMethodApproch()
        {
            try
            {
                //Generate Exception (NULL)
                object obj = null;
                string myStr = obj.ToString();

                //Generate Divide Zero Exception
                //int num = 0;
                //num /= num;

                return View();
            }
            catch(NullReferenceException)
            {
                return View("Your Custom Error Page");
            }
            catch(DivideByZeroException)
            {
                return View("Your Custom Error Page");
            }
        }

如果您使用某些外部 Dll / 外部控件,并且不确定其功能,那么您可以使用方法级(try...catch)异常处理。

使用此方法的主要缺点是错误处理逻辑无法重用。

** 全局异常处理 / "HandleError" 属性 **

什么是 HandleError 属性?

HandleErrorAttribute 用于处理由 ActionMethod 抛出的异常,并在出现未处理的异常时显示友好的错误页面。

  1. 在 Home 控制器中添加下面的 Action 方法
            public ActionResult EXHandleErrorAttributeApproch()
            {
                throw new Exception("Error While Processing");
            }

    运行此页面,我们可以找到一个异常,因为我们在代码中没有处理异常。

    现在,我们了解了如何显示友好的错误页面。

  2. HomeController 顶部设置 [HandleError] 属性,对于在其任何操作方法中出现的未处理异常,都将由它处理。

    注意:HandleError 属性需要在您的 web.config 文件中使用 customErrors mode="On"。

  3. 在 "App_Start" 文件夹中添加 FilterConfig.cs 类,并根据以下代码添加 "RegisterGlobalFilters" 方法。
    //Require Name Space: using System.Web.Mvc;
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
         filters.Add(new HandleErrorAttribute());
    }

  4. 现在,在 Global.asax.cs 文件中设置 RegisterGlobalFilters 方法。 将以下语句粘贴到 Global.asax.cs 文件中。
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

  5. Web.config 中启用自定义错误模式。 在您的 web.config 中添加以下代码
    <customErrors mode="On">     
    </customErrors>

    之后,而不是难看的黄色页面,我们只发现了两个语句,如下图所示

  6. 运行该项目并输入错误的 URL。(在这里,我们输入了错误的 ActionResult 名称,因此发生了 404 {找不到资源} 异常)

  7. 添加错误页面(对于 404 错误代码)
    public ActionResult ErrorPage404()
    {
        return View();
    }

    现在,在 Web.config 文件中将此页面引用到 customErrors

    <customErrors mode="On">
         <error statusCode="404" redirect="~/Home/ErrorPage404"/>
    </customErrors>

    运行此页面,然后再次执行步骤 6。 现在我们找到了自定义(友好)错误页面。

** 通过扩展 HandleErrorAttribute 类自定义异常过滤器 **

添加一个新类作为 "CustomErrorHandler",并将以下代码粘贴到该类中。

    public class CustomErrorHandler : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext exceptionContext)
        {
            if (!exceptionContext.ExceptionHandled)
            {
                string controllerName = (string)exceptionContext.RouteData.Values["controller"];
                string actionName = (string)exceptionContext.RouteData.Values["action"];
                var model = new HandleErrorInfo(exceptionContext.Exception, controllerName, actionName);

                //This code shows the attribute where we redirect from Filter
                exceptionContext.Result = new ViewResult
                {
                    ViewName = "ActionName of CustomError Page Name",
                    ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
                    TempData = exceptionContext.Controller.TempData
                };
            }
        }
    }    

现在,将 CustomErrorHandler 添加到 Filter 配置

filters.Add(new CustomErrorHandler());

因此,我们定义了自定义异常处理程序来处理异常。

现在只需在您的 ActionResult 方法或控制器顶部添加 [CustomErrorHandler] (如果要应用于所有 ActionResult 方法)。

        [CustomErrorHandler]   
        public ActionResult TestCustomHandler()
        {
            return View();
        }
© . All rights reserved.