为什么在处理Action的方法中捕获会截断堆栈跟踪?

Mat*_*eld 5 .net c# exception stack-trace

考虑这个小程序.忽略,如果你愿意,通用捕获,我保持简短的尝试并说明要点:

private static void Main(string[] args)
{
    Try(Fail);
}

private static void Fail()
{
    var x = ((string)null).Clone();
}

private static void Try(Action action)
{
    try
    {
        action();
    }
    catch (Exception exc)
    {
        Debug.WriteLine(exc.StackTrace);                
    }
}
Run Code Online (Sandbox Code Playgroud)

运行时,会生成以下内容(删除一些路径信息):

at Scratch.Program.Fail() in Program.cs:line 27
at Scratch.Program.Try(Action action) in Program.cs:line 34
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 为什么异常的堆栈跟踪会停止在方法中展开方法链Try()?我希望它能够超越Main()方法.

我一直无法找到任何关于停止异常展开的文件Try()- 所以我想了解这一点.

Dir*_*irk 2

Exception.StacktraceGetStackTrace到底会调用哪个
new StackTrace(this /* exception object */, true)。当与这些参数一起使用时,将评估堆栈跟踪以查找异常点,直到当前方法。添加的时候可以自己检查一下

catch (Exception exc)
{
    Debug.WriteLine(new StackTrace());
    Debug.WriteLine(new StackTrace(exc, true));          
}
Run Code Online (Sandbox Code Playgroud)

第二个版本是 返回的堆栈跟踪exc.StackTrace,第一个版本是从当前方法到入口点或线程启动的完整堆栈跟踪。