2010-10-11 74 views
4

我想使用ELMAH來記錄一個異常(而不是一直向上調用堆棧)並記錄整個調用堆棧。如何使用完整的調用堆棧記錄異常?

示例代碼:

protected void Page_Load(object sender, EventArgs e) 
    { 
     DoSomething(); 
    } 

    private void DoSomething() 
    { 
     try { TrySomething(); } 
     catch (Exception ex) { LogException(ex); } 
    } 

    private void TrySomething() 
    { 
     throw new NotImplementedException(); 
    } 

    public static void LogException(Exception ex) 
    { 
     var currentStack = new System.Diagnostics.StackTrace(true); 
     Elmah.ErrorSignal.FromCurrentContext().Raise(ex); 
    } 

現在,LogException方法中,我可以看到調用堆棧告訴我叫TrySomething()DoSomething的(),並拋出異常,但我不能看到通話顯示給我的Page_Load()稱爲DoSomething()。我希望能夠看到完整的調用堆棧。

什麼ex.StackTrace貌似裏面LogException方法舉例:

at WebApplication1._Default.TrySomething() in C:\Projects\test\GeneralTests\WebApplication1\Default.aspx.cs:line 26 
at WebApplication1._Default.DoSomething() in C:\Projects\test\GeneralTests\WebApplication1\Default.aspx.cs:line 20 

我可以從System.Diagnostics.StackTrace()充分調用堆棧,例如:

at WebApplication1._Default.LogException(Exception ex) 
at WebApplication1._Default.DoSomething() 
at WebApplication1._Default.Page_Load(Object sender, EventArgs e) 
[snip] 

(我可以通過步行StackTrace的每一幀來獲得行號和源文件的詳細信息)

但是,如何將此注入Exception或使用此調用堆棧提升新Exception尾巴?有沒有一個優雅的方式來做到這一點?我錯過了一些非常明顯的東西?!

+0

查閱這些在提供爲什麼你沒有得到充分調用堆棧有一個更好的瞭解相關問題的答案: http://stackoverflow.com/a/6094700/945456和http://stackoverflow.com/a/24297684/945456 – 2016-07-14 19:04:32

回答

1

當應用程序編譯時沒有調試標誌時,堆棧不一定會保留執行。您只能通過將try/catch添加到每種方法來保證每個項目的記錄。

+0

你的意思是方法調用可以內聯到執行序列中嗎?否則我不確定我是否理解你的意思 - 調用堆棧必須保留!? – Alex 2010-10-11 12:03:06

+0

是的,我認爲它是內聯。 Try/catch將繞過它,或者始終以調試模式構建。 – cjk 2010-10-11 12:44:19

+0

@Alex:他意味着編譯器(和JIT)經常通過內聯方法來優化你的代碼(儘管你可以使用MethodImplAttribute來阻止);在這種情況下,您將無法獲得完整的堆棧跟蹤。 – ShdNx 2010-10-11 12:44:23

1

你看過Exception.ToString()的結果嗎?它包含一個堆棧跟蹤。它是否包括你正在尋找的那種?

+2

ex.StackTrace是當前(內部)調用堆棧的字符串表示形式,但它不會將異常情況下的堆棧顯示給我。我將用ex.StackTrace的結果和我之後的結果更新問題主體 – Alex 2010-10-11 13:07:27

4

你可以做這樣的事情,以獲得完整的堆棧時出錯ocurrs:

var currentStack = new System.Diagnostics.StackTrace(true); 
return currentStack.ToString(); 
相關問題