[英]Why does catch in a method handling an Action truncate the 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);
}
}
運行時,將產生以下內容(除去了一些路徑信息):
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
視為堆棧跟蹤的一部分。 如果要查看Main
,則將catch
保留到Main
方法中:
public static void Main(string[] args)
{
try
{
Try(Fail);
}
catch (Exception e)
{
}
}
現在您看到:
在C:\\ Users \\ Yuval \\ documents \\ visual studio 14 \\ Projects \\ ConsoleApplication2 \\ ConsoleApplication2 \\ Program.cs中的ConsoleApplication2.Program.Fail()中,在C:\\ Users \\中的ConsoleApplication2.Program.Try(Action action)中的第25行Yuval \\ documents \\ visual studio 14 \\ Projects \\ ConsoleApplication2 \\ ConsoleApplication2 \\ Program.cs:C:\\ Users \\ Yuval \\ documents \\ visual studio 14 \\ Projects \\ ConsoleApplication2 \\中ConsoleApplication2.Program.Main(String [] args)的第30行ConsoleApplication2 \\ Program.cs:第15行
Exception.Stacktrace
調用GetStackTrace
,最后將調用
new StackTrace(this /* exception object */, true)
。 與這些參數一起使用時,將評估堆棧跟蹤的異常點,直到當前方法為止。 您可以在添加時檢查自己
catch (Exception exc)
{
Debug.WriteLine(new StackTrace());
Debug.WriteLine(new StackTrace(exc, true));
}
第二個版本是exc.StackTrace
返回的stacktrace,第一個版本是從當前方法到入口點或線程開始的完整stacktrace。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.