2010-06-10 26 views
5

我正在研究重新工作並簡化我在我支持的應用程序中的錯誤處理。目前,我們的所有頁面都是從我們創建的基類繼承而來的,而後者顯然繼承於System.Web.UI.Page。在這個基類中,OnError方法當前被覆蓋,然後調用MyBase.OnError,然後調用我們的自定義日誌記錄方法之一。何時重寫OnError?

我沒有看到覆蓋OnError方法的任何好處,我認爲最好讓Global.asax中的Application_Error方法負責處理未處理的異常(記錄它),然後處理customErrors部分該配置會觸發一個進程重定向用戶。

在網上尋找它看起來像人們經常重寫這種方法,但我沒有看到需要和來自MSDN的文章this讓我覺得一樣。

回答

2

我創建一個自定義的類名爲PageBase:

public class PageBase : Page 
{ 
    protected override void OnError(..) 
    { 
    //handle error, redirect to error page 
    } 
} 

所以我只有這樣做一次,並用它來捕獲未處理錯誤和重定向到錯誤頁面。這樣我必須做一次;我不知道Page.Error事件對應用程序錯誤有任何優點或缺點;但我使用頁面錯誤,因爲在這裏可以很方便;我可以清除錯誤並重定向到頁面上下文中的錯誤頁面......我的個人偏好。

感謝您的MSDN鏈接;這是一個很好的資源。

HTH。

+0

但同樣,爲什麼重寫onError方法?如果您需要在頁面上下文中處理信息,我理解您爲什麼要處理該上下文中的錯誤(記錄關於頁面的特定數據,用戶輸入,在屏幕上顯示消息等),但爲何忽略現有的OnError方法而不是使用Page_Error或Application_Error? – 2010-06-10 16:59:24

+0

page_error來自onerror(Page_Load從OnLoad方法等調用),所以這就是爲什麼OnError;它與Page_Error相同...所以真正的問題是爲什麼頁面錯誤與應用程序錯誤... – 2010-06-10 19:50:44

+1

通過上面提供的鏈接,「global.asax:Application_Error」部分上面的段落提到將代碼放入OnError Override方法與使用Page_Error不同。 所以,在你的情況下,我想你重寫了自己的重定向功能,所以它可能沒問題。就我而言,我們並不是真正覆蓋OnError方法中的任何功能,我們只是對引發的異常進行非常一般的記錄。我認爲我們可以將日誌記錄放在應用程序級別並刪除我們的OnError方法。感謝您的輸入。 – 2010-06-10 21:20:19

0

我可以看到一個場景,可能只有應用程序中的某些頁面從基類繼承,並且需要以不同方式處理錯誤。所有其他錯誤將被捕獲/記錄Application_Error

2

我從來沒有重寫OnError方法。我喜歡使用全局asax的Application_Error,它反過來會捕獲任何可能不會從您的基類繼承的頁面。此外,覆蓋方法用於改變它的功能,所以如果你不這樣做,我不會覆蓋它。

而且,我知道這不是你的問題的一部分,但我想看看ELMAH錯誤日誌:

http://code.google.com/p/elmah/