C#为什么Exception.StackTrace不包含完整的堆栈跟踪?

时间:2018-05-06 15:01:59

标签: c# exception architecture

我从MSDN读到:

  

StackTrace属性返回调用堆栈的帧,该调用堆栈的帧源自抛出异常的位置

这句话对我来说并不清楚,所以让我们看看例子:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            A();
        }
        catch (Exception e)
        {
            Console.WriteLine("second catch. Stacktrace: {0}", e.StackTrace);
        }
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    public static void A()
    {
        try
        {
            throw new Exception();
        }
        catch (Exception e)
        {
            Console.WriteLine("first catch. Stacktrace: {0}", e.StackTrace);
            throw;
        }
    }
}

输出:(隐藏'在'块')

first catch. Stacktrace:    
   at TestExceptions.Program.A()
second catch. Stacktrace:    
   at TestExceptions.Program.A()
   at TestExceptions.Program.Main(String[] args)

第一个catch块中的Exception.StackTrace不包含完整的堆栈跟踪,包括“Main”方法调用。 更一般地说,Exception.StackTrace只包含捕获块和抛出位置之间的堆栈帧。

有谁知道,为什么选择这样的决定?由于性能问题,还是存在其他一些问题?

更新

问题与that question不同。我想知道为什么选择exception.StackTrace会返回堆栈的部分。

0 个答案:

没有答案