2011-10-25 64 views
3

據我瞭解asp.net例外。如果我有一個頁面調用一些代碼,然後再調用另一個代碼。如果代碼的最後一部分(說它在一個不同的dll)拋出一個異常,並且它的處理無處不在,那麼我應該讓頁面在YSOD上拋出一個錯誤,該YSOD具有堆棧跟蹤,它以相反的時間順序顯示發生了什麼。所以我會在堆棧底部追蹤被執行的代碼的第一個位,然後在下一個位置流向頂部,發生實際錯誤。爲什麼我的堆棧跟蹤包含最初調用的頁面?

請記住,我有一個應用程序未顯示堆棧跟蹤中的aspx頁面。其也沒有顯示通常的初始呼叫到asp.net棧等:在錯誤幫助

(IntPtr的FP, 對象O,對象噸,EventArgs e)上 系統。 Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)at System.Web.UI.Control.OnLoad(EventArgs e)at Community.Support.BasePage.OnLoad(EventArgs e) C:\ Projects \ Unilever \ BinaryFiles \ Support \ BasePage.cs:line 389 at System.Web.UI.Control.LoadRecursive()at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterA同步點)

我真的不明白爲什麼。我得到的唯一提示是正在使用反射,我想知道這是爲什麼?

+0

它取決於幾個方面......例如,如果異常發生在不同的線程上,那麼你將不會得到「調用者」,因爲它甚至不在同一個棧上發生(每個線程都有它自己的棧)! – Yahia

+0

如果您重新拋出一個異常(或拋出一個新的異常而不保留現有堆棧在'InnerException'中),堆棧跟蹤會被重置。 – Oded

+1

「Community.Support.BasePage」不是實際的aspx頁面嗎?或者它甚至可能是一個派生自Web.UI.Page的類;你的實際aspx頁面來自這個類。 – deostroll

回答

0

由於您使用的是BasePage類,因此獲取詳細信息的好方法是重寫OnError方法;此方法觸發頁面中所有未處理的錯誤。然後,收集有關頁面的信息並將其添加到錯誤中,或將其添加到記錄的語句中。

HTH。