一种mvc下处理异常的与http错误的方法

很多网站如果由于用户输入错了地址,出现了如下图的网页

 

又或者网站的bug导致的应用程序异常,搞出来个满屏的红黄黑,

出现类似情况一定让用户大跌眼镜,个人认为,http错误与应用程序异常的处理方式应该是我们所需关注的问题。

解决方案

1.定义1个枚举类型用来存储http错误码,与应用程序异常错误

01 public enum DictSystemErrorType
02 {
03     /// <summary>
04     /// 系统错误
05     /// </summary>
06     SystemError = 1,
07     /// <summary>
08     /// 系统异常
09     /// </summary>
10     SystemException = 2,
11     /// <summary>
12     /// 404错误
13     /// </summary>
14     Http404Error = 404,
15     /// <summary>
16     /// 500错误
17     /// </summary>
18     Http500Error = 500
19 }

2.定义SystemErrorCollection静态类用来管理错误提示信息

01 public static class SystemErrorCollection
02 {
03     private static readonly IDictionary<int, string> SystemMsg = new Dictionary<int, string>
04                                                            {
05                                                                {1,"系统错误,请联系管理员!"},
06                                                                {2,"系统出现异常,请联系管理员!"},
07                                                                {404,"404错误,Really very sorry,The page not found!"},
08                                                                {500,"500错误,Internal Server Error!"},
09                                                            };
10     /// <summary>
11     /// 获取错误提示
12     /// </summary>
13     /// <param name="errCode"></param>
14     /// <returns></returns>
15     public static string GetSystemErrorMsg(int  errCode)
16     {
17         return SystemMsg.SingleOrDefault(p => p.Key == errCode).Value;
18     }
19 }

3.mvc下Global.asax文件和webForm下的一样,都继承自System.Web.HttpApplication,

 他们都包含Application_Error事件(当应用程序中遇到一个未处理的异常时,该事件被触发。

 定义Application_Error事件处理错误与异常

01 protected void Application_Error(object sender, EventArgs e)
02 {
03     Exception exception = Server.GetLastError();
04     Response.Clear();
05  
06     var httpException = exception as HttpException;
07     int errorCode = httpException == null ? (int)DictSystemErrorType.SystemException : httpException.GetHttpCode();
08  
09     //记录log  ...
10     //发送错误邮件给网站管理人员  ...
11  
12     var routeData = new RouteData();
13     routeData.Values.Add("controller", "Error");
14     routeData.Values.Add("action", "error");
15     routeData.Values.Add("errorCode", errorCode);
16     Server.ClearError();
17  
18     IController errorController = new ErrorController();
19     errorController.Execute(new RequestContext(new HttpContextWrapper(this.Context), routeData));
20 }

4.添加ErrorController与Error Action

01 public class ErrorController : Controller
02 {
03     //
04     // GET: /Error/
05  
06     public ActionResult error()
07     {
08         int errorCode = (int)(this.RouteData.Values["errorCode"] ?? DictSystemErrorType.SystemError);
09         ViewData["errorMsg"] = SystemErrorCollection.GetSystemErrorMsg(errorCode);
10         return View();
11     }
12 }

 杂谈

为方便管理错误码与提示信息,定义了枚举类型与一个IDictionary字典。

然而同时维护这两个东西着实有些不变,还好可以通过反射取得枚举的提示信息

 不过最好把错误提示信息对应错误码持久化到数据库或者xml文件中,然后将其缓存起来。

如此可随时更新错误信息,无需修改程序。

 

IController是很简单的,它主要的用途在于提供了关于路由的工具来找到控制器并调用执行(Execute)

Controller的HandleUnknownAction:控制器找不到相关的Action将会呼叫 HandleUnknownAction

另外值得注意的是:

mvc下如果你的某个Controller或者自定义基类的controller重写了HandleUnknownAction方法,

那么出现http404错误的话,该Controller执行完HandleUnknownAction,将不会再执行Application_Error!


本文源妈

posted @ 2010-07-15 11:13  rob_2010  阅读(283)  评论(0)    收藏  举报