2012-02-09 53 views
1

我在我的網站中添加了嘗試捕獲功能,效果很好。開發的下一部分是設置一些異常處理輸出。很明顯,我不希望網站崩潰時發生錯誤,我不想要一個可怕的錯誤屏幕。所以,在中間的某個地方會很好。 我想在主母版頁中有一個異常處理程序用戶控件,當出現錯誤時它將輸出一個很好的小消息。 將異常傳遞給此用戶控件的最佳方式是什麼?我正在考慮使用會話變量。ASP.NET異常處理演示文稿給用戶

有沒有人有解決這個問題的辦法?

謝謝

回答

5

這比你做的更容易。創建一個名爲error.aspx的頁面(或任何你想調用它的頁面),並打開web.config中的CustomErrors。

<configuration> 
    <system.web> 
    <customErrors defaultRedirect="errors.aspx" 
        mode="On"> 
    </customErrors> 
    </system.web> 
</configuration> 

有很多可配置性來處理不同的http錯誤或隨機異常。如果需要,可以將異常消息(或異常本身)轉儲到會話中,或使用HttpServerUtility.GetLastErrordocumentation),然後在錯誤頁面上輸出任意數量的不同消息。這甚至會發現你不會捕獲的異常。

CustomErrors Documentation

編輯:
@Icarus表明OP正在尋找通過該頁面繼續渲染和輸出,而只顯示在頁面中的錯誤信息的解決方案,所以我會提供一個回答也是如此。

過去我有幾種方法處理這個問題。對於非常複雜的頁面來說,所要求的行爲是致命的(頁面結果無法知道),我一直推遲到錯誤頁面,正如我在上面提到的那樣,它包含主要的主要元素。所以菜單,標題等都在那裏,但大災變的通知是顯而易見的。

您似乎正在尋找的行爲是我會少用一個需要報告異常而不是報告一般消息。我的首選是擁有一個用戶控件,它具有可以注入消息的公共可綁定屬性。如(原諒VB,我似乎無法找到我的C#版本):

<BrowsableAttribute(True), Bindable(False), Category("Misc"), _ 
    Description("Gets or sets the NavigateUrl property for the link to start a new request.")> _ 
Public Property MyImportantMessage() As String 
    Get 
     Return _myImportantMessage 
    End Get 
    Set(ByVal value As String) 
     _myImportantMessage= value 
    End Set 
End Property 

那麼輸出可能是你喜歡的任何字符串信息或者你可以在一些預設的程序中,從資源獲取,隨你。至於如何讓它在那裏,我們採取了MasterPage路線。我們在母版頁中有一個方法,直接在用戶控件中分配這樣一個屬性。爲了使此方法可調用,每個使用母版頁的頁面都必須包含VirtualPath屬性,否則該方法在編譯時將不可用。

<%@ MasterType 
    VirtualPath="~/MasterPage.master" %> 

這便於Master屬性從該網頁本身的調用來調用這個屬性:

'Keeping the VB theme 
Me.Master.SetImportantMessage(message) 

記住Me.Master從頁面內是不一樣的Page.Master。因此,您的異常可能需要冒泡到實際頁面,否則頁面引用本身必須作爲屬性發送到您的usercontrols。

+0

我同意這是一個asp.net網站上必備的東西,但是OP想要的東西是不同的,他想要一種方式在同一頁面內通知用戶,出現了問題。 – Icarus 2012-02-09 13:41:10

+0

@伊卡洛斯:我第一次沒有從這個問題中讀到,但是我會提供一個編輯來達到這個效果。謝謝。 – 2012-02-09 13:47:57

+0

+1這是一個非常全面的答案。 – Icarus 2012-02-09 14:12:09

0

如果你想爲處理異常提供了錯誤,它真的如填充一個標籤帶有某種通知應用程序出現了問題處理請求的那樣簡單。你會在聲明的「catch」部分內做到這一點。我甚至根據用戶的角色提供不同的消息。例如,如果管理員生成一個錯誤,你實際上可能會輸出實際的異常消息,但是如果某個角色較小的人生成了它,則會向他們顯示更通用的錯誤並向管理員組發送消息/電子郵件。

try 
{ 
    //your code here 
} 
catch (Exception ex) 
{ 
    if (Role!="Admin") 
    { 
    Label1.Text = "There was an error, the administrator has been notified." 
    } 
    else 
    { 
    Label1.Text = "Error: " + ex.Message + ": " + ex.StackTrace; //you could add further here if you want to look for an inner exception. 
    } 
}