2017-09-15 50 views
1

有時,當.NET類方法發生異常時,該方法本身在內部調用一堆其他方法,但是其中一個方法發生錯誤。這使得堆棧跟蹤臃腫和凌亂,比所需「更無意義」的東西。有沒有辦法得到一個堆棧跟蹤停止在公共.NET方法導致的錯誤,並顯示所有內部的.NET方法?是否可以生成一個排除內部方法的.NET堆棧跟蹤?

一個例子是ADO.NET的ExecuteNonQuery()。內部調用像5-6個函數,並且直到第6個嵌套函數纔會發生異常,所以堆棧跟蹤顯示了所有那些我們無法做或不關心的內部事件。如果它在ExecuteNonQuery()處停下來,它會更好,更乾淨,因爲這是面向公衆的.NET方法。

+1

是否有任何實際的原因?你可以抓到並重新拋出,但爲什麼? – Sinatr

+4

你確定內部方法名稱是無意義的嗎?例如。如果'ExecuteNonQuery'拋出'NullReferenceException',你從哪裏開始看?對比如果內部方法名稱包含「參數」一詞,是否不能幫助您更快地放大應該查找的位置? –

+0

您可以創建一個自定義的異常類並過濾出您不希望堆棧跟蹤的內容。 – PaulF

回答

4

簡短的回答是「否」,你不能改變.NET生成堆棧跟蹤的方式。當生成堆棧跟蹤時,它會顯示每個呼叫站點。但是,如果您想要有一些自定義行爲,則可以編寫一些自定義代碼來編輯您生成的堆棧跟蹤的輸出。

要生成一個堆棧跟蹤,可以使用如下代碼:

StackTrace stackTrace = new StackTrace();   
StackFrame[] stackFrames = stackTrace.GetFrames(); 

的構造將產生堆棧跟蹤數據,並.GetFrames()將方法會返回給你。從這一點來說,你可以根據需要進行篩選(使用stackFrame.GetMethod()讓每一幀的方法信息 - 無論是對其進行過濾,或將其添加到一個StringBuilder爲你的字符串輸出等)

參考:https://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace(v=vs.110).aspx

相關問題