簡體   English   中英

如何捕獲堆棧跟蹤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM