4

我通过在 filterConfig 注册中应用 HandleError 属性为应用程序启用了全局错误处理。

 public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }
}

然后,我使用自定义错误(web.config)希望为每个服务器错误显示友好的错误消息。

 <customErrors mode="On"  ></customErrors>

对于大多数异常,这似乎工作正常,并且我得到了预期的行为,因为正在显示自定义错误页面视图(共享视图文件夹中的 Error.cshtml)。

但是,我最近注意到,如果抛出的错误是 UnauthorizedAccessException,这不是我看到的行为。

我对此感到有些困惑,因为在 fiddler 中我看到这个 UnauthorizedAccessException 异常返回一个普通的 500 内部服务器错误,就像标准异常一样。

那么标准异常怎么会遵守我的 customError 设置而 UnauthorizedAccessException 却没有呢?

以及如何让它们表现相同,因为它们本质上都是一个错误,我想阻止最终用户看到。

4

2 回答 2

1

这篇博文为我提供了异常处理的概述,使我能够决定如何处理未授权访问异常,这实质上意味着在 Application_OnStart 中处理它们。

http://prideparrot.com/blog/archive/2012/5/exception_handling_in_asp_net_mvc

出于我的目的,使用 HandleErrorAttribute 和全局 Application_OnStart 处理错误似乎没有多大意义,因此出于我的目的,我决定最好在 Application_OnSTart 中处理所有内容,

于 2013-03-28T18:43:09.977 回答
0

如果您只想强制“未处理”异常,例如UnauthorizedAccessException通过正常的自定义错误页面,那么您可以覆盖控制器的 OnException 方法,如下所示:

    protected override void OnException(ExceptionContext filterContext)
    {
        base.OnException(filterContext);

        if (!filterContext.ExceptionHandled && filterContext.RequestContext.HttpContext.IsCustomErrorEnabled)
        {
            filterContext.ExceptionHandled = true;

            filterContext.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
            filterContext.Result = View("Error",
                new HandleErrorInfo(filterContext.Exception, filterContext.GetCurrentControllerName(), filterContext.GetCurrentActionName()));
        }
    }

不过,您引用的文章是更全面地解释错误处理技术的极好资源,也应该加以考虑。

于 2015-03-03T19:04:01.053 回答