[英]How to capture stack trace?
有時我會創建一個Exception
實例而不拋出它(例如將其直接傳遞給處理程序)。
OnException(new AuthorizationException());
如何使用當前位置初始化其堆棧跟蹤?
您可以使用Environment.StackTrace
屬性或使用StackTrace
類:
var stack = new StackTrace();
var data = stack.<whatever you need from it>
但我必須補充一點:你所做的事情在概念上非常糟糕。
你實際上問了兩個不同的問題(一個在標題中,另一個在最后)。
“如何捕獲堆棧跟蹤?”
只需查詢靜態System.Environment.StackTrace
屬性或通過new System.Diagnostics.StackTrace();
。
讀取這個屬性根本不需要你構造一個異常對象,所以也許你只需要它。
“如何用當前位置初始化[異常對象]的堆棧跟蹤?”
在實際throw
異常對象之前,不會初始化異常對象的StackTrace
屬性 。
“堆棧跟蹤是在拋出異常時創建的。這與Java相反,后者在構造異常對象期間創建堆棧跟蹤[...]。” - 公共語言基礎設施注釋標准 ,ch。 18,p。 301。
由於它是只讀屬性,因此您無法自己初始化它 - 除非您派生自己的異常類:
// don't do that:
class ExceptionWithPresetStackTrace : System.Exception
{
public ExceptionWithPresetStackTrace(string stackTrace)
{
this.stackTrace = stackTrace;
}
public override string StackTrace
{
get
{
return stackTrace;
}
}
readonly string stackTrace;
}
結合第一個問題的答案,您可以這樣做:
OnException(new ExceptionWithPresetStackTrace(System.Environment.StackTrace));
但是,這通常是個壞主意,因為它可以創建異常對象,將開發人員指向任何隨機位置(通過StackTrace
屬性),甚至是實際沒有發生錯誤的異常對象。 這是誤導性的,應該避免。
您可以將當前堆棧跟蹤作為字符串獲取:
http://msdn.microsoft.com/en-us/library/system.environment.stacktrace.aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.