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






4.80/5 (54投票s)
在本文中,我们将讨论在 ASP.NET MVC 中处理异常的 6 种方法。
目录
方法 4:- 继承自“HandleErrorAttribute”
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 天
如需进一步阅读,请观看以下面试准备视频和分步视频系列。