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

ASP.NET MVC 中的异常处理(6 种方法详解)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (54投票s)

2014年12月5日

CPOL

4分钟阅读

viewsIcon

421303

在本文中,我们将讨论在 ASP.NET MVC 中处理异常的 6 种方法。

目录

ASP.NET MVC 中的异常处理(6 种方法详解)

引言

方法 1:- 简单方法

方法 2:- 覆盖“OnException”方法

方法 3:- 使用“HandleError”属性

方法 4:- 继承自“HandleErrorAttribute”

方法 5:- 处理 HTTP 错误

方法 6:- MVC 中的全局错误处理

最佳实践是什么?

深入阅读

ASP.NET MVC 中的异常处理(6 种方法详解)

引言

在本文的 ASP.NET MVC 逐步讲解中,我们讨论了在 ASP.NET MVC 中处理异常的 6 种方法。在本文中,我们还讨论了 MVC 异常处理的最佳实践。

方法 1:- 简单方法

最简单的方法是使用传统的 .NET 异常处理方式,即 try 和 catch 块。当异常发生时,catch 块会被执行,它会重定向到错误视图。

但是,如果我们使用这种方法,我们将无法正确且完全地利用 MVC 异常机制。在接下来的部分中,我们将讨论可以通过哪些重要的五种方式来利用 MVC 提供的异常处理功能。

public ActionResult SomeError()
{
try
{}
catch(Exception ex)
{return View("Error");}
}

方法 2:- 覆盖“OnException”方法

在此方法中,我们可以覆盖控制器的“OnException”事件并将“Result”设置为视图名称。当此控制器中发生错误时,将调用此视图。在下面的代码中,您可以看到我们将“Result”设置为名为“Error”的视图。

我们还设置了异常,以便它可以显示在视图中。

public class HomeController : Controller
 {
        protected override void OnException(ExceptionContext filterContext)
        {
            Exception ex = filterContext.Exception;
            filterContext.ExceptionHandled = true;

     var model = new HandleErrorInfo(filterContext.Exception, "Controller","Action");

     filterContext.Result = new ViewResult()
{
                ViewName = "Error",
                ViewData = new ViewDataDictionary(model)
     };

        }
}

为了在视图中显示上述错误,我们可以使用以下代码:

  @Model.Exception;

这种方法的缺点是我们在多个控制器中无法重用错误处理逻辑。

方法 3:- 使用“HandleError”属性

处理错误的另一种方法是使用“HandleError”属性。实现“HandleError”属性是一个两步过程:-

步骤 1:- 我们首先需要使用“HandleError”属性来修饰操作方法,如下面的代码所示。

public class HomeController : Controller
 {
        [HandleError()]
        public ActionResult SomeError()
        {
            throw new Exception("test");
        }
}

步骤 2:- 在“Web.config”文件中,您需要添加“customErrors”标签并指向“Error”视图,如下面的“Web.config”代码片段所示。

<system.web>
<customErrors defaultRedirect="Error.cshtml" mode="On">
</customErrors>
</system.web> 

如果您希望针对不同的异常类型使用不同的错误视图,则可以使用多个“HandleError”属性修饰操作方法,并根据异常类型指向多个视图。

public class HomeController : Controller
{
        [HandleError(ExceptionType=typeof(ArithmeticException),View="Arthimetic")]
[HandleError(ExceptionType = typeof(NotImplementedException),View ="Error1")]
public ActionResult SomeError()
{
    
}
}

方法 4:- 继承自“HandleErrorAttribute”

所有先前方法的最大缺点之一是可重用性。错误处理逻辑无法在其他控制器中重用。

为了在控制器中重用错误处理逻辑,我们可以从“HandleErrorAttribute”类继承,并将此类作为属性修饰在控制器中。

public class Err : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
        {
            Exception ex = filterContext.Exception;
            filterContext.ExceptionHandled = true;
var model = new HandleErrorInfo(filterContext.Exception, "Controller", "Action");

            filterContext.Result = new ViewResult()
            {
                ViewName = "Error1",
                ViewData = new ViewDataDictionary(model)
            };
        }
    }

方法 5:- 处理 HTTP 错误

到目前为止讨论的所有 MVC 异常处理技术都无法处理 HTTP 错误,例如文件未找到、HTTP 500 错误等。为此,我们需要在配置文件中输入错误操作和错误状态代码,如下面的配置文件所示。

<system.web>
<customErrors
                  mode="On" defaultRedirect="Error1">
<error statusCode="404" redirect="~/Testing/NoPageFound"/>
</customErrors>
</system.web> 

方法 6:- MVC 中的全局错误处理

如果您希望在您的应用程序中进行全局错误处理,您可以覆盖“Application_Error”事件并从全局错误事件中执行 response.redirect。因此,如果错误处理未在控制器级别完成,它将传播到“Global.asax”文件。

public class MvcApplication : System.Web.HttpApplication
{
        protected void Application_Error(object sender, EventArgs e)
        {
            Exception exception = Server.GetLastError();
            Server.ClearError();
            Response.Redirect("/Home/Error");
        }
}

最佳实践是什么?

最好是“方法 4”和“方法 6”的组合。创建从“HandleErrorAttribute”类继承的错误处理类,并在控制器和操作方法上分别修饰它们。这样可以处理控制器和操作上发生的错误。

作为安全措施,通过使用“Application_Error”事件(如“方法 6”中所述),启用全局错误处理作为对任何意外和未处理错误的后备方案。

深入阅读

以下是一些关于互联网论坛的精彩讨论,可以帮助您进一步加强您的知识。

想开始学习 ASP.NET MVC 吗?从下面的视频开始,它将教您 MVC,时长为 16 小时,即 2 天

如需进一步阅读,请观看以下面试准备视频和分步视频系列。

© . All rights reserved.