[转载]一种mvc下处理异常的与http错误的方法

[转载]一种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方法,

那么出现http错误的话Application_Error将不会 再被执行!


本文源妈

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏