14

我相信我已经设置了我们的 MVC 应用程序以[HandleError]正确使用。这是我的控制器:

[HandleError]
public class SupportController : BaseController {

    public ActionResult Toss() {
        throw new Exception("uh oh");
    }
    // snip
}

已将customErrors标签设置web.config为“开”:

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

但是,我仍然在异常情况下获得黄屏死机。在我的操作中设置断点Toss()表明HttpContext.IsCustomErrorEnabled 设置为 true。

我们没有对 View Engine 做任何事情,BaseController也没有弄乱任何东西(其他不扩展它的控制器也有同样的问题)。

我在 Windows XP 上开发,当应用程序部署到服务器 2003 框(IIS 6)时遇到同样的问题。

我认为页面上没有异常error.aspx

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>

<asp:Content ID="errorContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2>
        Sorry, an error occurred while processing your request.
    </h2>
</asp:Content>

可能不同的是,这个应用程序是在 MVC Beta 是最新版本时创建的,并在发布时升级到 RC 和 RTM。可能有一些古怪的设置是从那里遗留下来的?

我可以在其他应用程序上使用它,所以我有点困惑。

4

7 回答 7

20

如果处理错误页面时出现问题,这往往会发生..如果您调试应用程序,在初始异常之后您将遇到另一个问题(错误页面中的异常)..我发生了这种情况以及我的原因是因为我有一个强类型的母版页,错误页面正在使用这个母版页,并且因为母版页与实际页面共享相同的模型,所以母版页获得的是 HandlerErrorInfo 模型,而不是我预期的类型化模型。

就我个人而言,我认为这是 asp.net mvc 中的一个糟糕的设计(连同它的其余部分),但是您可以通过不使用相同的母版页来轻松解决这个问题(您甚至可以在继承的地方进行母版页继承强类型母版页,纯粹从无类型的母版页继承图层。

否则,这是错误视图中发生的某种异常......(很可能)。

于 2009-06-17T14:22:39.163 回答
3

如果您使用的是 IE9,则存在另一个问题。如果小于 1Kb,似乎 IE9 会隐藏错误页面,如中所述:

asp-net-mvc-3-handleerror-global-filter-always-shows-iis-status-500-page

确保内容正文长度超过 1Kb。尝试在错误页面的末尾添加:

@(新字符串(' ', 1000))

于 2012-03-02T21:48:52.720 回答
2

这个问题的另一个原因可能是,

在 Template MVC Application(由 VS2008 / VS2008 Express 生成)中,Error.aspx(由 VS 生成)使用 Master Page。

如果母版页访问任何 ViewData 它将抛出空引用 Exception ,那么 error.aspx 将不会显示。

使用此简单代码作为您的 Error.aspx ,它将解决问题,(连同 CustomErrors=On )

<%@ Page Language="C#"  Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
<%= Model.Exception.Message %>
于 2009-07-27T14:20:35.067 回答
1

我遇到了同样的问题,经过调查,我发现我正在web.Debug.config更新web.config.

然后我在文件中创建了CustomErrors标签,web.config它对我有用。

于 2010-07-09T16:31:54.457 回答
1

我一直遇到类似的问题。通过这种“hack”,我能够获得理想的结果。

由于我所有的控制器都扩展了一个 BaseController,所以这适用于任何地方。

public class BaseController : Controller
{
    protected override void OnException(ExceptionContext filterContext)
    {

        Response.Write("<pre>" + filterContext.Exception.StackTrace + "</pre>");

        base.OnException(filterContext);

    }

}
于 2012-01-20T02:41:52.640 回答
1

我最近遇到了类似的问题。事实证明,引发异常的控制器 (HomeController) 中的方法被另一个控制器 (DispatchController) 中的方法调用。

我们必须将[HandleError]属性放在调用控制器上才能使其工作。

[HandleError(ExceptionType = typeof(SessionExpireException), View = "ErrorSessionExpired")]
public class DispatchController : Controller
{

我们还将自定义错误视图放置在调用控制器的文件夹结构中。
在 Dispatch 控制器文件夹中显示自定义错误视图的视图文件夹

于 2015-01-08T18:13:28.277 回答
0

费了一番周折之后,我发现我的问题属于“从代码中抛出异常只是为了在渲染错误视图时抛出另一个错误”的一般类别。我之前编写了一个强类型错误页面,期望出现 System.Exception,然后当我切换到使用 [HandleError] 属性时,过滤器正在向错误页面传递 System.HandleErrorInfo。第二个异常发生在这一行(在 Default.aspx.cs 中):

httpHandler.ProcessRequest(HttpContext.Current);

令人困惑。

于 2009-11-18T20:31:44.870 回答