如何捕获堆栈跟踪?

时间:2012-02-10 13:09:55

标签: c# .net exception exception-handling

有时我会创建一个Exception实例而不抛出它(例如将其直接传递给处理程序)。

OnException(new AuthorizationException());

如何使用当前位置初始化其堆栈跟踪?

3 个答案:

答案 0 :(得分:4)

您可以使用Environment.StackTrace属性或使用StackTrace类:

var stack = new StackTrace();
var data = stack.<whatever you need from it>

但我必须补充一点:你所做的事情在概念上非常糟糕。

答案 1 :(得分:3)

你实际上问了两个不同的问题(一个在标题中,另一个在最后)。

  

&#34;如何捕获堆栈跟踪?&#34;

只需查询static System.Environment.StackTrace property或通过new System.Diagnostics.StackTrace();

读取此属性根本不需要构造异常对象,因此可能只需要它。

  

&#34;如何使用当前位置初始化[异常对象]堆栈跟踪?&#34;

在您实际throw异常对象之前,未初始化异常对象StackTrace property

  

&#34;在抛出异常时创建堆栈跟踪。这与Java形成对比,Java在构造异常对象期间创建堆栈跟踪[...]。&#34;    - The Common Language Infrastructure Annotated Standard,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属性),即使实际上没有发生错误的位置也是如此。这是误导性的,应该避免。

答案 2 :(得分:0)

您可以将当前堆栈跟踪作为字符串获取:

http://msdn.microsoft.com/en-us/library/system.environment.stacktrace.aspx