2011-01-27 29 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代码。