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
也会发生这种情况:我接受这一点,因为它回答了问题,没有留下任何其他问题-非常感谢。