C# 为什么处理操作的方法中的catch会截断堆栈跟踪?

C# 为什么处理操作的方法中的catch会截断堆栈跟踪?,c#,.net,exception,stack-trace,C#,.net,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(); }

考虑一下这个小程序。如果你愿意的话,请忽略泛型捕获,我将其保持简短,以尝试说明这一点:

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);                
    }
}
运行时,将生成以下内容(删除部分路径信息):

at Scratch.Program.Fail() in Program.cs:line 27
at Scratch.Program.Try(Action action) in Program.cs:line 34
我的问题是-为什么异常的堆栈跟踪停止在
Try()
方法处展开方法链?我希望它能够通过
Main()
方法将其展开

我还没有找到任何文档,说明是什么阻止异常解除,并通过
Try()
-因此我想了解这一点。

这是:

try
{
    action();
}
catch (Exception exc)
{
    Debug.WriteLine(exc.StackTrace);                
}
Try
中捕获异常,并且不会向上传播以释放调用堆栈,它只是吞下异常。因此,您不会将
Main
作为stacktrace的一部分。如果要查看
Main
,请将
catch
留给
Main
方法:

public static void Main(string[] args)
{
    try
    {
        Try(Fail);
    }
    catch (Exception e)
    {
    }
}
现在你看到了:

在控制台应用程序2.Program.Fail()中 C:\Users\Yuval\documents\visual studio 14\Projects\ConsoleApplication2\ConsoleApplication2\Program.cs:第25行 在控制台应用程序2.Program.Try(操作)中 C:\Users\Yuval\documents\visual studio 14\Projects\ConsoleApplication2\ConsoleApplication2\Program.cs:第30行 在控制台应用程序2.Program.Main(字符串[]args)中 C:\Users\Yuval\documents\visual studio 14\Projects\ConsoleApplication2\ConsoleApplication2\Program.cs:第15行

调用
GetStackTrace
,最终将调用
新堆栈跟踪(此/*异常对象*/,true)
。当与这些参数一起使用时,堆栈跟踪将针对异常点进行评估,直到当前方法失效。您可以在添加时自己检查

catch (Exception exc)
{
    Debug.WriteLine(new StackTrace());
    Debug.WriteLine(new StackTrace(exc, true));          
}

第二个版本是由
exc.stacktrace
返回的stacktrace,第一个版本是从当前方法到入口点或线程开始的完整stacktrace

您正在
Try()
中捕获异常,如果在
Main()
中捕获异常,则堆栈跟踪将在此处结束。这实际上与
操作
无关,即使你只有
Try
直接呼叫
Fail
也会发生这种情况:我接受这一点,因为它回答了问题,没有留下任何其他问题-非常感谢。