ASP.NET MVC中的统一化自定义异常处理

当ASP.NET MVC程序出现了异常,怎么处理更加规范?

1. 最简单的方法是设置<customErrors/>节点

<customErrors>节点用于定义一些自定义错误信息的信息。此节点有Mode和defaultRedirect两个属性,其中defaultRedirect属性是一个可选属性,表示应用程序发生错误时重定向到的默认URL,如果没有指定该属性则显示一般性错误。Mode属性是一个必选属性,它有三个可能值,它们所代表的意义分别如下:
On 表示在本地和远程用户都会看到自定义错误信息。
Off 禁用自定义错误信息,本地和远程用户都会看到详细的错误信息。
RemoteOnly 表示本地用户将看到详细错误信息,而远程用户将会看到自定义错误信息。

这里有必要说明一下本地用户和远程用户的概念。当我们访问asp.net应用程时所使用的机器和发布asp.net应用程序所使用的机器为同一台机器时成为本地用户,反之则称之为远程用户。在开发调试阶段为了便于查找错误Mode属性建议设置为Off,而在部署阶段应将Mode属性设置为On或者RemoteOnly,以避免这些详细的错误信息暴露了程序代码细节从而引来黑客的入侵。

<error>子节点

在<customErrors>节点下还包含有<error>子节点,这个节点主要是根据服务器的HTTP错误状态代码而重定向到我们自定义的错误页面,注意要使<error>子节点下的配置生效,必须将<customErrors>节点节点的Mode属性设置为“On”。下面是一个例子:

<customErrors mode="On" defaultRedirect="GenericErrorPage.htm"> 
     <error statusCode="403" redirect="403.htm" /> 
     <error statusCode="404" redirect="404.htm" /> 
</customErrors>

在上面的配置中如果用户访问的页面不存在就会跳转到404.htm页面,如果用户没有权限访问请求的页面则会跳转到403.htm页面,403.htm和404.htm页面都是我们自己添加的页面,我们可以在页面中给出友好的错误提示。

2. 使用过滤器HandleErrorAttribute

随着ASP.NET MVC版本的更新,出现了HandleErrorAttribute,使用Filter以AOP的思想实现了针对于Action的异常处理。使用此Filter后,当程序中出现异常的时候,会去封装这些异常信息,然后路由自动转到该Controller对应的Error.cshtml中,如果此路径下没有改文件,则会到shared目录中寻找此文件。另外一个相关的是在Global.asax中的protected void Application_Error(object sender, EventArgs e)方法,是捕捉异常的最后一道防线,也就是说,这是最高层次的异常捕获处理逻辑。使用HandleErrorAttribute后,找到了Error.cshtml,则此时异常已经被捕获处理,所以不会再次被Application_Error捕获处理。此外,可以通过@model HandleErrorInfo 在Error.cshtml中定制显示异常信息。有一点需要注意的是,HandleErrorAttribute是在customErrors基础之上的,如果想使用HandleErrorAttribute,customErrors的Mode必须要设置为On或RemoteOnly. 否则,HandleErrorAttribute将不起作用。

3. 自定义显示路径

如果遇到异常后不单单是要自定义异常显示,而且还需要进行日志记录。此时,可以通过继承扩展HandleErrorAttribute来实现新的Filter,然后在lobal.ascx中对所有的Action进行注册,filters.Add(new MyHandleErrorAttribute()).在这里详细说明一下另一种方式。我们可以写一个专门的Controller和Action来进行异常发生时的路由设置.

public class UtilityController : Controller
    {
        public ActionResult Error()
        {
            return View();
        }

        public ActionResult PageNotFound()
        {
            return View();
        }
}
当出现异常的时候,把异常抛到最顶端,由Application_Error统一处理。这里的统一处理就包括,记录日志,重新进行页面定向等。
protected void Application_Error(object sender, EventArgs e)
        {
            var ex = Server.GetLastError();
            Log.Error(ex); //记录日志信息
            var httpStatusCode = (ex is HttpException) ? (ex as HttpException).GetHttpCode() : 500; //这里仅仅区分两种错误
            var httpContext = ((MvcApplication)sender).Context;
            httpContext.ClearError();
            httpContext.Response.Clear();
            httpContext.Response.StatusCode = httpStatusCode;
            var shouldHandleException = true;
            HandleErrorInfo errorModel;

            var routeData = new RouteData();
            routeData.Values["controller"] = "Utility";

            switch (httpStatusCode)
            {
                case 404:
                    routeData.Values["action"] = "PageNotFound";
                    errorModel = new HandleErrorInfo(new Exception(string.Format("No page Found", httpContext.Request.UrlReferrer), ex), "Utility", "PageNotFound");
                    break;

                default:
                    routeData.Values["action"] = "Error";
                    Exception exceptionToReplace = null; //这里使用了EntLib的异常处理模块的一些功能
                    shouldHandleException = ExceptionPolicy.HandleException(ex, "LogAndReplace", out exceptionToReplace);
                    errorModel = new HandleErrorInfo(exceptionToReplace, "Utility", "Error");
                    break;
            }

            if (shouldHandleException)
            {
                var controller = new UtilityController();
                controller.ViewData.Model = errorModel; //通过代码路由到指定的路径
                ((IController)controller).Execute(new RequestContext(new HttpContextWrapper(httpContext), routeData));
            }
        }
    }

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
eFrameWork(asp.net)开发框架(以下简称框架)是E客开发团队(EKETEAM以下简称e客)从业十余年开发经验的累积,经众多项目磨合及客户意见、建议不断优化完善而来。 框架主要用于B/S架构的应用系统及网站开发,本身并没有高精尖技术,一切从提高开发效率、降低开发门槛的角度出发设计。 框架主要的特点就是实现最大程度的自动化,开发者不用关心数据的增删改查如何去实现,框架提供一套在线的开发平台,在开发平台进行定义后,系统读取定义的配置实现程序功能, 开发者要做的事主要是前端的修改及信息入库后的处理(如:产生新信息、计算、汇总、审批等特殊处理),从而提高开发效率。 使用eFrameWork框架的优势: 1.统一开发标准。 2.提高开发效率、降低开发周期及人员需求。 3.逐步形成自己的项目资源库并在新项目重用。 4.代码量小,大型项目尤为明显,方便后续维护升级。 5.简单易用,在线配置即可完成常规模块的开发,降低开发门槛,提高开发效率。 6.卓越的性能表现。 7.支持系统在线开发、维护。 8.灵活的自定义让框架能适应更多场景成为可能。 9.支持传统asp.netMVC。 10.提供基础的角色权限。 11.提供简单的审批流程设置。 12.提供DEMO,方便学习和展示框架功能特点。 13.图像文件自动压缩处理功能。 14.丰富的数据编辑组件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值