如何捕获堆栈跟踪

本文关键字:跟踪 堆栈 何捕获 | 更新日期: 2023-09-27 18:24:06

有时我创建一个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不同,Java在构造异常对象[…]的过程中创建堆栈跟踪。"—《公共语言基础设施注释标准》,第18章,第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