2011-01-27 27 views
8

是否有任何屬性可以應用於樣板方法,以便這些方法不會出現在堆棧軌跡中?我有很多它們,在某些情況下它們有幾個層次。這只是混亂的事情。如何告訴編譯器忽略堆棧跟蹤中的方法?

實施例的代碼:用C

在Spork.Program.ThrowMe()::

class Program 
{ 
    public static void ThrowMe() 
    { 
     throw new NotImplementedException(); 
    } 

    public static void HideMe() 
    { 
     ThrowMe(); 
    } 
    static void Main(string[] args) 
    { 
     try 
     { 
      HideMe(); 
     } 
     catch (Exception e) 
     { 

     } 
    } 
} 

這引發此堆棧跟蹤\項目\ XXX \測試沙箱\ ConsoleTesting \ Program.cs的:線58

在Spork.Program.HideMe()在C:\項目\ XXX \測試沙箱\ ConsoleTesting \ Program.cs的:線64

在Spork.Program.Main(字串[] args)在C:\項目\ XXX \測試沙盒\ ConsoleTesting \的Program.cs:行70

+10

你要求的東西在某些情況下是方便的,在其他情況下是惡夢。想象一下其他人正在讀你的堆棧跟蹤,並看到`Main`叫做`ThrowMe()`。然後他們調查'Main',但無法看到呼叫的來源。另外,想象一下`Main`是500行,所以它不像你的樣本那麼明顯。我同情你,但最終這個「特徵」會被濫用,編碼將是一場噩夢,這就是爲什麼它不存在。 – 2011-01-27 16:52:34

+0

非常好的一點。 – Amy 2011-01-27 17:13:03

回答

7

把控制檯.WriteLine(e)在catch塊中。切換到發佈版本並按下Ctrl + F5。你會看到這一點:

System.NotImplementedException: The method or operation is not implemented. 
    at ConsoleApplication1.Program.ThrowMe() in C:\Users\hpassant\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs:line 9 
    at ConsoleApplication1.Program.Main(String[] args) in C:\Users\hpassant\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs:line 17 

注意,HideMe()方法是在堆棧跟蹤不可見。任務完成。

該方法調用未在跟蹤中顯示,因爲JIT優化程序內嵌了方法:這是隱藏堆棧跟蹤中方法的唯一方法。

它不是你可以很好控制的東西,該方法必須是'小',而不是自己拋出任何異常。否則這通常被認爲是一個問題,而不是一個功能。很難弄清楚如何從A代碼到B代碼。