在ASP.NET中,错误处理是通过使用标准的尝试捕捉方法或使用应用程序事件。ASP.NET MVC附带内置支持,被称为异常过滤器功能异常处理。在这里我们要学习两种方法:一个是定义HandleError过滤器,另一个是重写onException方法。
覆盖onException方法
使用这种方式在当要处理整个操作方法所有的异常在控制器级别。
要理解这种方式,创建一个MVC应用程序(包括跟随在前面章节中的步骤)。现在添加一个新的控制器类,并添加以下代码将覆盖onException方法,并明确在行动方法抛出一个错误:
现在,让我们创建一个通用的视图名为Error,显示给用户在任何异常的应用程序发生时。在Views文件夹内,创建一个名为Shared的新文件夹,并添加一个新的名为Error的视图。
拷贝下面下面的代码到新建文件: Error.cshtml:
如果现在尝试运行应用程序,它会给出结果如下。当任何异常发生在控制器内的操作方法时,上面的代码会渲染错误在视图中。
这种方法的优点是,在同一个控制器中的多个动作可以共享这个错误处理逻辑。 但是,缺点是不能跨越多个控制器使用相同的错误处理逻辑。
HandleError属性
HandleError的属性是学习过滤器过滤操作之一,在操作过滤器的篇章。HandleErrorAttribute是IExceptionFilter是的默认实现。该过滤器处理所有的控制器动作,过滤器和视图引发的例外。
要使用此功能,首先打开web.config文件的customErrors部分。打开web.config把System.Web下面的代码,并将其值设置为ON。
<customErrors mode="On"/> |
我们已经有了下查看Shared文件夹中创建的错误视图。这一次,这个视图文件的代码更改为强类型,键入使用HandleErrorInfo模型(这是System.Web.MVC下存在):
@model System.Web.Mvc.HandleErrorInfo
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Error</title>
</head>
<body>
<h2>
Sorry, an error occurred while processing your request.
</h2>
<h2>Exception details</h2>
<p>
Controller: @Model.ControllerName <br>
Action: @Model.ActionName
Exception: @Model.Exception
</p>
</body>
</html> |
现在,将下面的代码在控制器文件,其中规定在控制器文件[HandleError]属性。
using System;
using System.Data.Common;
using System.Web.Mvc;
namespace ExceptionHandlingMVC.Controllers
{
[HandleError]
public class ExceptionHandlingController : Controller
{
public ActionResult TestMethod()
{
throw new Exception("Test Exception");
return View();
}
}
} |
如果尝试现在运行的应用程序,会得到类似如下的错误:
正如所看到的,这一次的错误包含了控制器和动作细节相关的更多信息。以这种方式,HandleError可用于在任何级别和跨控制器处理这样的错误。
|