MVC 中的异常处理






4.88/5 (11投票s)
全局异常处理,使用 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
抛出的异常,并在出现未处理的异常时显示友好的错误页面。
- 在 Home 控制器中添加下面的 Action 方法
public ActionResult EXHandleErrorAttributeApproch() { throw new Exception("Error While Processing"); }
运行此页面,我们可以找到一个异常,因为我们在代码中没有处理异常。
现在,我们了解了如何显示友好的错误页面。
- 在
HomeController
顶部设置[HandleError]
属性,对于在其任何操作方法中出现的未处理异常,都将由它处理。注意:HandleError 属性需要在您的 web.config 文件中使用 customErrors mode="On"。
- 在 "App_Start" 文件夹中添加 FilterConfig.cs 类,并根据以下代码添加 "
RegisterGlobalFilters
" 方法。//Require Name Space: using System.Web.Mvc; public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); }
- 现在,在 Global.asax.cs 文件中设置
RegisterGlobalFilters
方法。 将以下语句粘贴到 Global.asax.cs 文件中。FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
- 在 Web.config 中启用自定义错误模式。 在您的 web.config 中添加以下代码
<customErrors mode="On"> </customErrors>
之后,而不是难看的黄色页面,我们只发现了两个语句,如下图所示
- 运行该项目并输入错误的 URL。(在这里,我们输入了错误的
ActionResult
名称,因此发生了 404 {找不到资源} 异常) - 添加错误页面(对于 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(); }