MVC框架 - 异常处理
2015-10-14 22:39
274 查看
在ASP.NET中,错误处理是通过使用标准的尝试捕捉方法或使用应用程序事件。ASP.NET MVC附带内置支持,被称为异常过滤器功能异常处理。在这里我们要学习两种方法:一个是定义HandleError过滤器,另一个是重写onException方法。
要理解这种方式,创建一个MVC应用程序(包括跟随在前面章节中的步骤)。现在添加一个新的控制器类,并添加以下代码将覆盖onException方法,并明确在行动方法抛出一个错误:
现在,让我们创建一个通用的视图名为Error,显示给用户在任何异常的应用程序发生时。在Views文件夹内,创建一个名为Shared的新文件夹,并添加一个新的名为Error的视图。
拷贝下面下面的代码到新建文件: Error.cshtml:
如果现在尝试运行应用程序,它会给出结果如下。当任何异常发生在控制器内的操作方法时,上面的代码会渲染错误在视图中。
这种方法的优点是,在同一个控制器中的多个动作可以共享这个错误处理逻辑。 但是,缺点是不能跨越多个控制器使用相同的错误处理逻辑。
要使用此功能,首先打开web.config文件的customErrors部分。打开web.config把System.Web下面的代码,并将其值设置为ON。
我们已经有了下查看Shared文件夹中创建的错误视图。这一次,这个视图文件的代码更改为强类型,键入使用HandleErrorInfo模型(这是System.Web.MVC下存在):
现在,将下面的代码在控制器文件,其中规定在控制器文件[HandleError]属性。
如果尝试现在运行的应用程序,会得到类似如下的错误:
正如所看到的,这一次的错误包含了控制器和动作细节相关的更多信息。以这种方式,HandleError可用于在任何级别和跨控制器处理这样的错误。
覆盖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可用于在任何级别和跨控制器处理这样的错误。
相关文章推荐
- 九度OJ 1008:最短路径问题 (最短路)
- null pointer at org.springframework.beans.PropertyEditorRegistrySupport
- sprintf——把数据写入字符串中
- 【特种兵Excel教程】如何用Excel制作数据透视表?
- Netty使用Http上传文件
- 51nod 1179 最大的最大公约数 (好题!!!!)
- 《大道至简》第三章读后感
- javascript window.onload $(document).ready()
- 给出 《java学习笔记》 PDF格式
- A Smart PostgreSQL extension plproxy 2.2 practices
- 黑马程序员一一高级开发工具Eclipse
- Lock与synchronized 的区别
- Spring 容器初始化方法
- MVC框架 - 捆绑
- Android第一个程序
- java缓存技术
- puppet部署
- linux用户程序调用栈打印backtrace
- Gamasutra:2014年全球十大游戏工作室
- 二叉堆实现二