Mvc2.0 处理自定义错误.

遇到很奇怪的问题:

新建Mvc2.0项目,添加新的Area,在 Area里的 Web.config 配置  <customErrors  mode="On"/> , 在Area里的Controller 加上 ErrorHandle , 在Shared里添加 Error.aspx.

Action 抛一个错.

显示正确的 Error.aspx 里的信息,没问题.

 

在真实项目中, 不能通过. 显示 运行时错误,需要配置 customErrors .

 

到现在依然没有找到真正的原因.

现只记录解决的结果(在此感谢 TomXu 的大力帮助 ):

public class MyError : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.StatusCode = 500;

            ProcException(filterContext, filterContext.Exception);
        }

        public static void ProcException(ControllerContext filterContext, Exception exp)
        {
            #region errorHtml
            string ErrorHtml = @"error";
            #endregion
            ErrorHtml = ErrorHtml.Replace("~/", MyUrl.GetUrlHeader())
                .Replace("$ErrorMsg$", exp != null ? exp.Message : "");
            //base.OnException(filterContext);
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;

            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.Write(ErrorHtml);
            filterContext.HttpContext.Response.Flush();
            filterContext.HttpContext.Response.End();
        }
    }
    [MyError]
    public class MyHostController : MyMvcController
    {
        protected override IActionInvoker CreateActionInvoker()
        {
            return new MyHostActionInvoker();
        }
        protected override void HandleUnknownAction(string actionName)
        {
            try
            {
                base.HandleUnknownAction(actionName);
            }
            catch (Exception e)
            {
                this.ControllerContext.HttpContext.Response.StatusCode = 404;
                MyError.ProcException(this.ControllerContext, e);
            }
        }
    }

  

发现有两个 Exception 的地方, 一个是 ExceptionContext.Exception ,另一个是 HttpContext.Current.Error,而两个Exception 没有多大关系。

个人初步判断: 如果 HttpContext.Current.Error 里有错误,则会抛到 IIS 来处理。而Mvc的错误处理机制是 Exception 保存在了 ExceptionContext 中,绕开了HttpContext.Current.Error 。 

待日后验证。

 

posted @ 2011-12-20 16:34  NewSea  阅读(765)  评论(0编辑  收藏  举报