Welcome 微信登录

首页 / 网页编程 / ASP.NET / ASP.NET MVC集成EntLib实现“自动化”异常处理[实例篇]

ASP.NET MVC集成EntLib实现“自动化”异常处理[实例篇]2012-08-30 博客园 Artech个人觉得异常处理对于程序员来说是最为熟悉的同时也是最难掌握的。说它熟 悉,因为仅仅就是try/catch/finally而已。说它难以掌握,则是因为很多开发人 员却说不清楚try/catch/finally应该置于何处?什么情况下需要对异常进行日志 记录?什么情况下需要对异常进行封装?什么情况下需要对异常进行替换?对于 捕获的异常,在什么情况下需要将其再次抛出?什么情况下则不需要?

合理的异常处理应该是场景驱动的,在不同的场景下,采用的异常处理策略往 往是不同的。异常处理的策略应该是可配置的,因为应用程序出现怎样的异常往 往是不可预测的,现有异常策略的不足往往需要在真正出现某种异常的时候才会 体现出来,所以我们需要一种动态可配置的异常处理策略维护方式。目前有一些 开源的异常处理框架提供了这种可配置的、场景驱动的异常处理方式,EntLib的 Exception Handling Application Block(以下简称EHAB)就是一个不错的选择 。[

一、通过指定Handle-Error-Action响应请求

在正式介绍如何通过扩展实现与EntLib以实现自动化异常处理之前,我们不妨 先来体验一下异常处理具有怎样的“自动化”特性。以用户登录场景为例,我们 在通过Visual Studio的ASP.NET MVC项目模板创建的Web应用中定义了如下一个简 单的数据类型LoginInfo封装用户登录需要输入的用户名和密码。

 1: public class LoginInfo
2: {
3: [DisplayName("用户名")]
4: [Required(ErrorMessage="请输入{0}")]
5: public string UserName { get; set; }
6: 
7: [DisplayName("密码")]
8: [Required(ErrorMessage = "请输入{0}")]
9: [DataType(DataType.Password)]
10: public string Password { get; set; }
11: }
然后我们定义了如下一个HomeController。基于HTTP-GET的Action方法Index 将会呈现一个用户登录View,该View使用创建的LoginInfo对象作为其Model。真 正的用户验证逻辑定义在另一个应用了HttpPostAttrubute特性的Index方法中: 如果用户名不为Foo,抛出InvalidUserNameException异常;如果密码不是 “password”,则抛出InvalidPasswordException异常。 InvalidUserNameException和InvalidPasswordException是我们自定义的两种异 常类型。

 1: [ExceptionPolicy("defaultPolicy")]
2: public class HomeController : ExtendedController
3: {
4: public ActionResult Index()
5: {
6: return View(new LoginInfo());
7: }
8: 
9: [HttpPost]
10: [HandleErrorAction("OnIndexError")]
11: public ActionResult Index(LoginInfo loginInfo)
12: {
13: if (string.Compare(loginInfo.UserName, "foo", true) != 0)
14: {
15: throw new InvalidUserNameException();
16: }
17: 
18: if (loginInfo.Password != "password")
19: {
20: throw new InvalidPasswordException();
21: }
22: return View(loginInfo);
23: }
24: 
25: [HttpPost]
26: public ActionResult OnIndexError(LoginInfo loginInfo)
27: {
28: return View(loginInfo);
29: }
30: }