2009-06-15 45 views
15

我相信我已經建立了我們的MVC應用程序使用[HandleError]正常。這是我的控制器:ASP.NET MVC的HandleError不工作(的customErrors設置爲「開」)

[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也沒有混淆任何事情(和其他控制器沒有擴展它有同樣的問題)。

當應用程序部署到服務器2003箱我開發在Windows XP,和有同樣的問題(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測試版是最新版本,並升格爲RC,然後RTM發佈。可能有從那裏遺留下來的一些奇怪的設置?

我能得到這個工作的其他應用程序,所以我有點狼狽。

+0

是〜\ Views \ Support或〜\ Views \ Shared中的error.aspx頁面嗎? – Talljoe 2009-06-15 23:00:52

+0

〜\ Views \ Shared - 甚至嘗試過[HandleError(View =「〜/ Views/Shared/Error.aspx」)](did not work) – swilliams 2009-06-15 23:16:40

回答

19

這往往如果調試應用程序,你的問題觸及(從錯誤頁面除外)初始異常後立即發生,如果沒有處理錯誤頁面的問題..我有這種情況發生,並我的原因是因爲我有一個強類型主頁面,錯誤頁面正在使用此主頁面,並且由於主頁面與實際頁面共享同一模型,主頁面正在獲取HandlerErrorInfo模型,而不是類型模型我期望..

我個人認爲這是一個可憐的設計在asp.net mvc(以及其餘的),但你可以避開這個很容易通過不使用相同的母版頁(你甚至可以做masterpage繼承,你有一個純粹的i繼承的強類型母版頁從類型化一個nherits層..

否則這是某種異常的錯誤觀點發生的事情。(最有可能)。

+1

你並不是100%正確,但是你讓我走上了正確的軌道。主頁沒有模型,但它確實做了一些推測可能拋出空引用異常的東西。使用非主分頁視圖的作品。謝謝! – swilliams 2009-06-17 16:36:38

+1

很高興幫助,在asp.net mvc中有很多令人頭痛的問題,我似乎一直在找到它們,並且認爲我應該爲某些人「頭部受到鍵盤影響」而採取行動。 :) – meandmycode 2009-06-17 19:55:49

2

另一個原因的問題可能是,

在模板MVC應用,Error.aspx(由VS生成)(由VS2008/VS2008快速生成)使用母版頁。

如果母版頁訪問會拋出空引用異常任何ViewData的,那麼error.aspx將不會顯示。

使用這個簡單的代碼爲您Error.aspx,它會解決這個問題,(有沿的customErrors = ON)

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %> 
<%= Model.Exception.Message %> 
0

多拔頭髮,我發現我的問題屬於一般類別後「在拋出錯誤視圖時僅從代碼拋出異常以引發另一個錯誤。「之前我寫過一個強類型的錯誤頁面,期望發生System.Exception,然後當我切換到使用[HandleError]屬性時,過濾器將錯誤頁面傳遞給System.HandleErrorInfo。第二個異常發生在此行(in Default.aspx.cs):

httpHandler.ProcessRequest(HttpContext.Current); 

混淆

1

我有同樣的問題,調查後,我發現我是web.config下更新web.Debug.config文件

然後,我創建的。 web.config文件中的CustomErrors標記,它工作正常g對我來說。

0

我一直在遇到類似的問題。我用這個「黑客」獲得了理想的結果。

因爲我所有的控制器都擴展了BaseController,所以它在任何地方都可以工作。

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

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

     base.OnException(filterContext); 

    } 

} 
1

我最近遇到了類似的問題。事實證明,引發異常(HomeController)的控制器中的方法正被不同控制器(DispatchController)中的方法調用。

我們必須在調用控制器上放置[HandleError]屬性才能使其工作。

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

我們還將自定義錯誤視圖放置在調用控制器的文件夾結構中。
View folder showing custom error view in the Dispatch controller folder