2012-09-25 62 views
7

我可以在堆棧跟蹤中拋出一些文本嗎?在堆棧跟蹤中寫入

我的應用程序已經掌握了拋出的異常。但想獲得更多關於某些方法(參數)的信息。

當時的想法是做類似

StackTrace.Insert (0, "argument:" + test); 

我知道這是不是很酷,但是這可能嗎?

+0

這樣就足夠了嗎?拋出新的InvalidOperationException(「argument1:」+ test +「,argument2:」+ test2);' –

+0

但它會停止我的方法,不是嗎? –

+4

解決方案是否可以創建異常,並將參數放入[數據字典屬性](http://msdn.microsoft.com/en-us/library/system.exception.data(v = vs.100)的.aspx)? (然後拋出異常...) – erikH

回答

13

創建例外,並將參數放入Data dictionary property。然後拋出異常......

+1

做了它的答案,因爲我的評論被投票有用,我認爲這是一個答案比評論更多。 – erikH

+0

非常好。關鍵是拋出這個新創建的異常,否則StackTrace將不會被填充。 – puddinman13

2

根據定義,堆棧跟蹤是程序中當前執行點處的活動堆棧幀的輸出,通常通過Exception來訪問。

@David Yaw給你正確的方式來添加額外的信息到堆棧跟蹤,因爲它冒泡了異常堆棧。換句話說,當它是異常的結果時,您應該只將自定義數據添加到堆棧跟蹤中。

要麼創建一些可集中訪問的List集合來存儲日誌數據,要麼按照David的建議,使用異常冒泡的正確try/catch。例如

try 
{ 
    doSomethingThatMightFailAndThrowAnException(); 
} 
catch (Exception ex) 
{ 
    throw new Exception("Here is some custom data to add to the trace...",ex); 
    // Notice adding the ex as the second parameter preserves the original exception trace 
} 
5

只需添加到@ erikH的出色答卷:

除了使用Data屬性,如果你需要更多的數據可高達異常鏈,您可以通過以下方式這樣做自定義異常。除了自定義類型可以提供的元信息(CommunicationException可能意味着I/O問題,InvalidStateException可能意味着程序遇到無效狀態,等等),您可以將附加信息添加到自定義字段的形式。當您需要Data屬性不提供的類型安全時,自定義字段特別有用。