簡體   English   中英

為什么在處理Action的方法中截斷堆棧跟蹤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM